@raintonic/formaui 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/CHANGELOG.md +104 -7
  2. package/LICENSE +21 -0
  3. package/README.md +199 -145
  4. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -1
  5. package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -1
  6. package/fesm2022/raintonic-formaui-cdk-overlay.mjs +0 -26
  7. package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
  8. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +2 -2
  9. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -1
  10. package/fesm2022/raintonic-formaui-components-accordion.mjs +2 -2
  11. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
  12. package/fesm2022/raintonic-formaui-components-alert.mjs +24 -5
  13. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
  14. package/fesm2022/raintonic-formaui-components-autocomplete.mjs +38 -9
  15. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
  16. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  17. package/fesm2022/raintonic-formaui-components-badge.mjs +45 -31
  18. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
  19. package/fesm2022/raintonic-formaui-components-big-menu.mjs +23 -5
  20. package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +1 -1
  21. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +24 -7
  22. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
  23. package/fesm2022/raintonic-formaui-components-button-group.mjs +6 -6
  24. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
  25. package/fesm2022/raintonic-formaui-components-button.mjs +63 -17
  26. package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
  27. package/fesm2022/raintonic-formaui-components-card.mjs +8 -8
  28. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  29. package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
  30. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
  31. package/fesm2022/raintonic-formaui-components-data-table.mjs +67 -9
  32. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  33. package/fesm2022/raintonic-formaui-components-date-picker.mjs +63 -16
  34. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
  35. package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
  36. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
  37. package/fesm2022/raintonic-formaui-components-drawer.mjs +19 -4
  38. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  39. package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
  40. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
  41. package/fesm2022/raintonic-formaui-components-file-upload.mjs +25 -5
  42. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
  43. package/fesm2022/raintonic-formaui-components-form-field.mjs +21 -6
  44. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  45. package/fesm2022/raintonic-formaui-components-icon.mjs +2 -2
  46. package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
  47. package/fesm2022/raintonic-formaui-components-input.mjs +1 -1
  48. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  49. package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
  50. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
  51. package/fesm2022/raintonic-formaui-components-menu.mjs +4 -4
  52. package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -1
  53. package/fesm2022/raintonic-formaui-components-number-input.mjs +20 -5
  54. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
  55. package/fesm2022/raintonic-formaui-components-paginator.mjs +27 -7
  56. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
  57. package/fesm2022/raintonic-formaui-components-password-input.mjs +23 -5
  58. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
  59. package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
  60. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
  61. package/fesm2022/raintonic-formaui-components-progressbar.mjs +32 -7
  62. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
  63. package/fesm2022/raintonic-formaui-components-radio.mjs +4 -4
  64. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
  65. package/fesm2022/raintonic-formaui-components-select.mjs +41 -26
  66. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  67. package/fesm2022/raintonic-formaui-components-side-panel.mjs +19 -4
  68. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  69. package/fesm2022/raintonic-formaui-components-sidebar.mjs +23 -5
  70. package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +1 -1
  71. package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
  72. package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
  73. package/fesm2022/raintonic-formaui-components-slider.mjs +23 -5
  74. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
  75. package/fesm2022/raintonic-formaui-components-spinner.mjs +24 -7
  76. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
  77. package/fesm2022/raintonic-formaui-components-stepper.mjs +2 -2
  78. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
  79. package/fesm2022/raintonic-formaui-components-tab.mjs +10 -10
  80. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
  81. package/fesm2022/raintonic-formaui-components-tag.mjs +21 -4
  82. package/fesm2022/raintonic-formaui-components-tag.mjs.map +1 -1
  83. package/fesm2022/raintonic-formaui-components-time-picker.mjs +26 -7
  84. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
  85. package/fesm2022/raintonic-formaui-components-toggle.mjs +2 -2
  86. package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
  87. package/fesm2022/raintonic-formaui-components-toolbar.mjs +41 -7
  88. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  89. package/fesm2022/raintonic-formaui-components-tooltip.mjs +2 -2
  90. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
  91. package/fesm2022/raintonic-formaui-components-tree-select.mjs +2 -2
  92. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
  93. package/fesm2022/raintonic-formaui-components-tree-table.mjs +35 -6
  94. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
  95. package/fesm2022/raintonic-formaui-components-tree.mjs +25 -7
  96. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
  97. package/fesm2022/raintonic-formaui-core.mjs +25 -1
  98. package/fesm2022/raintonic-formaui-core.mjs.map +1 -1
  99. package/fesm2022/raintonic-formaui-services-dialog.mjs +37 -37
  100. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  101. package/fesm2022/raintonic-formaui-services-notification.mjs +2 -2
  102. package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
  103. package/fesm2022/raintonic-formaui-services-theme.mjs +3 -3
  104. package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
  105. package/fesm2022/raintonic-formaui-test-utils.mjs +21 -16
  106. package/fesm2022/raintonic-formaui-test-utils.mjs.map +1 -1
  107. package/fesm2022/raintonic-formaui.mjs +1 -1
  108. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  109. package/llms-full.txt +36 -122
  110. package/llms.txt +4 -5
  111. package/package.json +1 -5
  112. package/styles/index.scss +5 -5
  113. package/styles/partials/_motion.scss +25 -0
  114. package/styles/partials/_theme.scss +6 -5
  115. package/styles/partials/components/_button.scss +361 -0
  116. package/styles/partials/components/_dialog.scss +180 -0
  117. package/styles/partials/components/_overlay.scss +87 -0
  118. package/styles/partials/themes/_dark.scss +14 -0
  119. package/styles/partials/themes/_light.scss +14 -0
  120. package/types/raintonic-formaui-cdk-overlay.d.ts +0 -1
  121. package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
  122. package/types/raintonic-formaui-components-alert.d.ts +11 -1
  123. package/types/raintonic-formaui-components-alert.d.ts.map +1 -1
  124. package/types/raintonic-formaui-components-autocomplete.d.ts +25 -7
  125. package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -1
  126. package/types/raintonic-formaui-components-badge.d.ts +20 -9
  127. package/types/raintonic-formaui-components-badge.d.ts.map +1 -1
  128. package/types/raintonic-formaui-components-big-menu.d.ts +12 -1
  129. package/types/raintonic-formaui-components-big-menu.d.ts.map +1 -1
  130. package/types/raintonic-formaui-components-breadcrumb.d.ts +11 -2
  131. package/types/raintonic-formaui-components-breadcrumb.d.ts.map +1 -1
  132. package/types/raintonic-formaui-components-button-group.d.ts +6 -6
  133. package/types/raintonic-formaui-components-button.d.ts +9 -7
  134. package/types/raintonic-formaui-components-button.d.ts.map +1 -1
  135. package/types/raintonic-formaui-components-card.d.ts +4 -4
  136. package/types/raintonic-formaui-components-checkbox.d.ts +1 -1
  137. package/types/raintonic-formaui-components-data-table.d.ts +56 -16
  138. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
  139. package/types/raintonic-formaui-components-date-picker.d.ts +32 -4
  140. package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -1
  141. package/types/raintonic-formaui-components-drawer.d.ts +10 -1
  142. package/types/raintonic-formaui-components-drawer.d.ts.map +1 -1
  143. package/types/raintonic-formaui-components-file-upload.d.ts +12 -1
  144. package/types/raintonic-formaui-components-file-upload.d.ts.map +1 -1
  145. package/types/raintonic-formaui-components-form-field.d.ts +12 -2
  146. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
  147. package/types/raintonic-formaui-components-input.d.ts +1 -1
  148. package/types/raintonic-formaui-components-number-input.d.ts +11 -2
  149. package/types/raintonic-formaui-components-number-input.d.ts.map +1 -1
  150. package/types/raintonic-formaui-components-paginator.d.ts +13 -1
  151. package/types/raintonic-formaui-components-paginator.d.ts.map +1 -1
  152. package/types/raintonic-formaui-components-password-input.d.ts +12 -2
  153. package/types/raintonic-formaui-components-password-input.d.ts.map +1 -1
  154. package/types/raintonic-formaui-components-progressbar.d.ts +14 -1
  155. package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -1
  156. package/types/raintonic-formaui-components-select.d.ts.map +1 -1
  157. package/types/raintonic-formaui-components-side-panel.d.ts +10 -1
  158. package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -1
  159. package/types/raintonic-formaui-components-sidebar.d.ts +12 -1
  160. package/types/raintonic-formaui-components-sidebar.d.ts.map +1 -1
  161. package/types/raintonic-formaui-components-slider.d.ts +12 -1
  162. package/types/raintonic-formaui-components-slider.d.ts.map +1 -1
  163. package/types/raintonic-formaui-components-spinner.d.ts +12 -2
  164. package/types/raintonic-formaui-components-spinner.d.ts.map +1 -1
  165. package/types/raintonic-formaui-components-tag.d.ts +10 -1
  166. package/types/raintonic-formaui-components-tag.d.ts.map +1 -1
  167. package/types/raintonic-formaui-components-time-picker.d.ts +14 -2
  168. package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -1
  169. package/types/raintonic-formaui-components-toggle.d.ts +1 -1
  170. package/types/raintonic-formaui-components-toolbar.d.ts +22 -4
  171. package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -1
  172. package/types/raintonic-formaui-components-tree-table.d.ts +29 -4
  173. package/types/raintonic-formaui-components-tree-table.d.ts.map +1 -1
  174. package/types/raintonic-formaui-components-tree.d.ts +12 -1
  175. package/types/raintonic-formaui-components-tree.d.ts.map +1 -1
  176. package/types/raintonic-formaui-core.d.ts +19 -2
  177. package/types/raintonic-formaui-core.d.ts.map +1 -1
  178. package/types/raintonic-formaui-services-dialog.d.ts +1 -1
  179. package/types/raintonic-formaui-services-theme.d.ts +3 -3
  180. package/types/raintonic-formaui-test-utils.d.ts +15 -2
  181. package/types/raintonic-formaui-test-utils.d.ts.map +1 -1
  182. package/types/raintonic-formaui.d.ts +1 -1
  183. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs +0 -266
  184. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs.map +0 -1
  185. package/types/raintonic-formaui-components-dynamic-form.d.ts +0 -412
  186. package/types/raintonic-formaui-components-dynamic-form.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-core.mjs","sources":["../../../lib/core/form-field-control.ts","../../../lib/core/error-state.ts","../../../lib/core/raintonic-formaui-core.ts"],"sourcesContent":["import { Observable } from 'rxjs';\nimport { NgControl } from '@angular/forms';\nimport { InjectionToken, Signal } from '@angular/core';\n\n/**\n * Interface for form field controls following Angular Material patterns\n * This interface should be implemented by any component that can be used inside fui-form-field\n */\nexport interface FuiFormFieldControl<T = unknown> {\n /**\n * Stream that emits whenever the state of the control changes\n */\n readonly stateChanges: Observable<void>;\n\n /**\n * The value of the control\n */\n readonly value: Signal<T | null>;\n\n /**\n * The placeholder for this control\n */\n readonly placeholder: Signal<string>;\n\n /**\n * The NgControl for this control (non-reactive)\n */\n readonly ngControl: NgControl | null;\n\n /**\n * Whether the control is focused\n */\n readonly focused: Signal<boolean>;\n\n /**\n * Whether the control is empty\n */\n readonly empty: Signal<boolean>;\n\n /**\n * Whether the control is required\n */\n readonly required: Signal<boolean>;\n\n /**\n * Whether the control is disabled\n */\n readonly disabled: Signal<boolean>;\n\n /**\n * Whether the control is in an error state\n */\n readonly errorState: Signal<boolean>;\n\n /**\n * The aria-describedby attribute on the control\n */\n readonly controlType?: string;\n\n /**\n * The element ID for the control\n */\n readonly id: string;\n\n /**\n * Handles a click on the control's container\n */\n onContainerClick(event: MouseEvent): void;\n\n /**\n * Sets the list of element IDs that describe the control\n */\n setDescribedByIds(ids: string[]): void;\n\n /**\n * Sets the read-only state of the control (propagated from form-field)\n */\n setReadOnly?(readOnly: boolean): void;\n}\n\n/**\n * Injection token used to provide the form field control to the form field\n */\nexport const FUI_FORM_FIELD_CONTROL = new InjectionToken<FuiFormFieldControl>('FuiFormFieldControl');\n","import { Injectable } from '@angular/core';\nimport { FormControl, FormGroupDirective, NgControl, NgForm } from '@angular/forms';\nimport { Subject } from 'rxjs';\n\n/**\n * Error state matcher that follows Angular Material patterns\n * Determines when to show error messages\n */\nexport interface ErrorStateMatcher {\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean;\n}\n\n/**\n * Default error state matcher implementation\n * Shows errors when control is invalid and either touched or form is submitted\n */\n@Injectable({ providedIn: 'root' })\nexport class DefaultErrorStateMatcher implements ErrorStateMatcher {\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\n const isSubmitted = form?.submitted;\n return !!(control && control.invalid && (control.touched || isSubmitted));\n }\n}\n\n/**\n * Interface for components that can display error state\n */\nexport interface CanUpdateErrorState {\n readonly stateChanges: Subject<void>;\n errorState: boolean;\n errorStateMatcher: ErrorStateMatcher | null;\n updateErrorState(): void;\n}\n\n/**\n * Mixin to add error state handling to a component\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Mixin pattern requires any[] for constructor spread\nexport type Constructor<T = object> = new (...args: any[]) => T;\n\nexport interface HasErrorState {\n _defaultErrorStateMatcher: ErrorStateMatcher;\n _parentForm: NgForm | FormGroupDirective | null;\n _parentFormGroup: FormGroupDirective | null;\n ngControl: NgControl | null;\n}\n\n/**\n * Mixin that adds error state handling\n */\nexport function mixinErrorState<T extends Constructor<HasErrorState>>(base: T): Constructor<CanUpdateErrorState> & T {\n return class extends base implements CanUpdateErrorState {\n errorState = false;\n isErrorState = false;\n errorStateMatcher: ErrorStateMatcher | null = null;\n readonly stateChanges = new Subject<void>();\n\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor, @typescript-eslint/no-explicit-any -- Mixin pattern requires any[] for constructor spread\n constructor(...args: any[]) {\n super(...args);\n }\n\n updateErrorState(): void {\n this._updateErrorState();\n }\n\n _updateErrorState(): void {\n const isOldState = this.isErrorState;\n const parent = this._parentFormGroup ?? this._parentForm;\n const matcher = this.errorStateMatcher ?? this._defaultErrorStateMatcher;\n const control = this.ngControl ? (this.ngControl.control as FormControl) : null;\n const isNewState = matcher.isErrorState(control, parent);\n\n if (isNewState !== isOldState) {\n this.isErrorState = isNewState;\n this.errorState = isNewState;\n this.stateChanges.next();\n }\n }\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAgFA;;AAEG;MACU,sBAAsB,GAAG,IAAI,cAAc,CAAsB,qBAAqB;;ACvEnG;;;AAGG;MAEU,wBAAwB,CAAA;IACnC,YAAY,CAAC,OAA2B,EAAE,IAAwC,EAAA;AAChF,QAAA,MAAM,WAAW,GAAG,IAAI,EAAE,SAAS;AACnC,QAAA,OAAO,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC;IAC3E;uGAJW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AA+BlC;;AAEG;AACG,SAAU,eAAe,CAAuC,IAAO,EAAA;IAC3E,OAAO,cAAc,IAAI,CAAA;QACvB,UAAU,GAAG,KAAK;QAClB,YAAY,GAAG,KAAK;QACpB,iBAAiB,GAA6B,IAAI;AACzC,QAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;;AAG3C,QAAA,WAAA,CAAY,GAAG,IAAW,EAAA;AACxB,YAAA,KAAK,CAAC,GAAG,IAAI,CAAC;QAChB;QAEA,gBAAgB,GAAA;YACd,IAAI,CAAC,iBAAiB,EAAE;QAC1B;QAEA,iBAAiB,GAAA;AACf,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,WAAW;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,yBAAyB;AACxE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAI,IAAI,CAAC,SAAS,CAAC,OAAuB,GAAG,IAAI;YAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;AAExD,YAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,gBAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YAC1B;QACF;KACD;AACH;;AChFA;;AAEG;;;;"}
1
+ {"version":3,"file":"raintonic-formaui-core.mjs","sources":["../../../lib/core/form-field-control.ts","../../../lib/core/error-state.ts","../../../lib/core/intl/fui-intl-base.ts","../../../lib/core/raintonic-formaui-core.ts"],"sourcesContent":["import { Observable } from 'rxjs';\r\nimport { NgControl } from '@angular/forms';\r\nimport { InjectionToken, Signal } from '@angular/core';\r\n\r\n/**\r\n * Interface for form field controls following Angular Material patterns\r\n * This interface should be implemented by any component that can be used inside fui-form-field\r\n */\r\nexport interface FuiFormFieldControl<T = unknown> {\r\n /**\r\n * Stream that emits whenever the state of the control changes\r\n */\r\n readonly stateChanges: Observable<void>;\r\n\r\n /**\r\n * The value of the control\r\n */\r\n readonly value: Signal<T | null>;\r\n\r\n /**\r\n * The placeholder for this control\r\n */\r\n readonly placeholder: Signal<string>;\r\n\r\n /**\r\n * The NgControl for this control (non-reactive)\r\n */\r\n readonly ngControl: NgControl | null;\r\n\r\n /**\r\n * Whether the control is focused\r\n */\r\n readonly focused: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is empty\r\n */\r\n readonly empty: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is required\r\n */\r\n readonly required: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is disabled\r\n */\r\n readonly disabled: Signal<boolean>;\r\n\r\n /**\r\n * Whether the control is in an error state\r\n */\r\n readonly errorState: Signal<boolean>;\r\n\r\n /**\r\n * The aria-describedby attribute on the control\r\n */\r\n readonly controlType?: string;\r\n\r\n /**\r\n * The element ID for the control\r\n */\r\n readonly id: string;\r\n\r\n /**\r\n * Handles a click on the control's container\r\n */\r\n onContainerClick(event: MouseEvent): void;\r\n\r\n /**\r\n * Sets the list of element IDs that describe the control\r\n */\r\n setDescribedByIds(ids: string[]): void;\r\n\r\n /**\r\n * Sets the read-only state of the control (propagated from form-field)\r\n */\r\n setReadOnly?(readOnly: boolean): void;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the form field control to the form field\r\n */\r\nexport const FUI_FORM_FIELD_CONTROL = new InjectionToken<FuiFormFieldControl>('FuiFormFieldControl');\r\n","import { Injectable } from '@angular/core';\r\nimport { FormControl, FormGroupDirective, NgControl, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * Error state matcher that follows Angular Material patterns\r\n * Determines when to show error messages\r\n */\r\nexport interface ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean;\r\n}\r\n\r\n/**\r\n * Default error state matcher implementation\r\n * Shows errors when control is invalid and either touched or form is submitted\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DefaultErrorStateMatcher implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\r\n const isSubmitted = form?.submitted;\r\n return !!(control && control.invalid && (control.touched || isSubmitted));\r\n }\r\n}\r\n\r\n/**\r\n * Interface for components that can display error state\r\n */\r\nexport interface CanUpdateErrorState {\r\n readonly stateChanges: Subject<void>;\r\n errorState: boolean;\r\n errorStateMatcher: ErrorStateMatcher | null;\r\n updateErrorState(): void;\r\n}\r\n\r\n/**\r\n * Mixin to add error state handling to a component\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Mixin pattern requires any[] for constructor spread\r\nexport type Constructor<T = object> = new (...args: any[]) => T;\r\n\r\nexport interface HasErrorState {\r\n _defaultErrorStateMatcher: ErrorStateMatcher;\r\n _parentForm: NgForm | FormGroupDirective | null;\r\n _parentFormGroup: FormGroupDirective | null;\r\n ngControl: NgControl | null;\r\n}\r\n\r\n/**\r\n * Mixin that adds error state handling\r\n */\r\nexport function mixinErrorState<T extends Constructor<HasErrorState>>(base: T): Constructor<CanUpdateErrorState> & T {\r\n return class extends base implements CanUpdateErrorState {\r\n errorState = false;\r\n isErrorState = false;\r\n errorStateMatcher: ErrorStateMatcher | null = null;\r\n readonly stateChanges = new Subject<void>();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor, @typescript-eslint/no-explicit-any -- Mixin pattern requires any[] for constructor spread\r\n constructor(...args: any[]) {\r\n super(...args);\r\n }\r\n\r\n updateErrorState(): void {\r\n this._updateErrorState();\r\n }\r\n\r\n _updateErrorState(): void {\r\n const isOldState = this.isErrorState;\r\n const parent = this._parentFormGroup ?? this._parentForm;\r\n const matcher = this.errorStateMatcher ?? this._defaultErrorStateMatcher;\r\n const control = this.ngControl ? (this.ngControl.control as FormControl) : null;\r\n const isNewState = matcher.isErrorState(control, parent);\r\n\r\n if (isNewState !== isOldState) {\r\n this.isErrorState = isNewState;\r\n this.errorState = isNewState;\r\n this.stateChanges.next();\r\n }\r\n }\r\n };\r\n}\r\n","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * Base class for every FormaUI component Intl service.\r\n * Exposes a `changes` Subject so consumers that mutate strings at runtime\r\n * can trigger a re-render in all components that subscribe.\r\n *\r\n * Consumers extend and override properties, OR provide a replacement class via DI.\r\n */\r\n@Injectable()\r\nexport abstract class FuiIntlBase implements OnDestroy {\r\n /** Emits whenever the labels change. Components subscribe and mark for check. */\r\n readonly changes = new Subject<void>();\r\n\r\n /** Call after mutating properties to notify subscribers. */\r\n notifyChanges(): void {\r\n this.changes.next();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.changes.complete();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAgFA;;AAEG;MACU,sBAAsB,GAAG,IAAI,cAAc,CAAsB,qBAAqB;;ACvEnG;;;AAGG;MAEU,wBAAwB,CAAA;IACnC,YAAY,CAAC,OAA2B,EAAE,IAAwC,EAAA;AAChF,QAAA,MAAM,WAAW,GAAG,IAAI,EAAE,SAAS;AACnC,QAAA,OAAO,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC;IAC3E;uGAJW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AA+BlC;;AAEG;AACG,SAAU,eAAe,CAAuC,IAAO,EAAA;IAC3E,OAAO,cAAc,IAAI,CAAA;QACvB,UAAU,GAAG,KAAK;QAClB,YAAY,GAAG,KAAK;QACpB,iBAAiB,GAA6B,IAAI;AACzC,QAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;;AAG3C,QAAA,WAAA,CAAY,GAAG,IAAW,EAAA;AACxB,YAAA,KAAK,CAAC,GAAG,IAAI,CAAC;QAChB;QAEA,gBAAgB,GAAA;YACd,IAAI,CAAC,iBAAiB,EAAE;QAC1B;QAEA,iBAAiB,GAAA;AACf,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,WAAW;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,yBAAyB;AACxE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAI,IAAI,CAAC,SAAS,CAAC,OAAuB,GAAG,IAAI;YAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;AAExD,YAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,gBAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YAC1B;QACF;KACD;AACH;;AC7EA;;;;;;AAMG;MAEmB,WAAW,CAAA;;AAEtB,IAAA,OAAO,GAAG,IAAI,OAAO,EAAQ;;IAGtC,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;IACzB;uGAXoB,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAX,WAAW,EAAA,CAAA;;2FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACVD;;AAEG;;;;"}
@@ -400,44 +400,44 @@ class FuiDialogContainerComponent {
400
400
  this._elementFocusedBeforeDialogWasOpened = null;
401
401
  }
402
402
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiDialogContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
403
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.6", type: FuiDialogContainerComponent, isStandalone: true, selector: "fui-dialog-container", host: { listeners: { "keydown": "_onKeydown($event)" }, classAttribute: "fui-dialog-container-host" }, viewQueries: [{ propertyName: "_dialogContainer", first: true, predicate: ["dialogContainer"], descendants: true, static: true }], ngImport: i0, template: `
404
- <div
405
- #dialogContainer
406
- class="fui-dialog-container"
407
- [class.fui-dialog-enter]="animationState() === 'enter'"
408
- [class.fui-dialog-exit]="animationState() === 'exit'"
409
- [attr.role]="config.role || 'dialog'"
410
- [attr.aria-modal]="true"
411
- [attr.aria-label]="config.ariaLabel"
412
- [attr.aria-labelledby]="config.ariaLabelledBy"
413
- [attr.aria-describedby]="config.ariaDescribedBy"
414
- tabindex="-1"
415
- >
416
- <div class="fui-dialog-content" aria-live="polite">
417
- <ng-content></ng-content>
418
- </div>
419
- </div>
403
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.6", type: FuiDialogContainerComponent, isStandalone: true, selector: "fui-dialog-container", host: { listeners: { "keydown": "_onKeydown($event)" }, classAttribute: "fui-dialog-container-host" }, viewQueries: [{ propertyName: "_dialogContainer", first: true, predicate: ["dialogContainer"], descendants: true, static: true }], ngImport: i0, template: `
404
+ <div
405
+ #dialogContainer
406
+ class="fui-dialog-container"
407
+ [class.fui-dialog-enter]="animationState() === 'enter'"
408
+ [class.fui-dialog-exit]="animationState() === 'exit'"
409
+ [attr.role]="config.role || 'dialog'"
410
+ [attr.aria-modal]="true"
411
+ [attr.aria-label]="config.ariaLabel"
412
+ [attr.aria-labelledby]="config.ariaLabelledBy"
413
+ [attr.aria-describedby]="config.ariaDescribedBy"
414
+ tabindex="-1"
415
+ >
416
+ <div class="fui-dialog-content" aria-live="polite">
417
+ <ng-content></ng-content>
418
+ </div>
419
+ </div>
420
420
  `, isInline: true, styles: [":host{display:block;outline:0}.fui-dialog-container{display:flex;flex-direction:column;box-sizing:border-box;overflow:auto;outline:0;max-height:inherit;border:1px solid var(--fui-border-color);border-radius:var(--fui-border-radius-md);background:var(--fui-surface-00);box-shadow:var(--fui-dialog-box-shadow, var(--fui-shadow-05))}.fui-dialog-content{display:contents}.fui-dialog-enter{animation:fui-dialog-enter var(--fui-duration-moderate-02) var(--fui-ease-entrance)}.fui-dialog-exit{animation:fui-dialog-exit var(--fui-duration-moderate-01) var(--fui-ease-exit)}@keyframes fui-dialog-enter{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes fui-dialog-exit{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@media(prefers-reduced-motion:reduce){.fui-dialog-enter,.fui-dialog-exit{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
421
421
  }
422
422
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiDialogContainerComponent, decorators: [{
423
423
  type: Component,
424
- args: [{ selector: 'fui-dialog-container', standalone: true, imports: [], template: `
425
- <div
426
- #dialogContainer
427
- class="fui-dialog-container"
428
- [class.fui-dialog-enter]="animationState() === 'enter'"
429
- [class.fui-dialog-exit]="animationState() === 'exit'"
430
- [attr.role]="config.role || 'dialog'"
431
- [attr.aria-modal]="true"
432
- [attr.aria-label]="config.ariaLabel"
433
- [attr.aria-labelledby]="config.ariaLabelledBy"
434
- [attr.aria-describedby]="config.ariaDescribedBy"
435
- tabindex="-1"
436
- >
437
- <div class="fui-dialog-content" aria-live="polite">
438
- <ng-content></ng-content>
439
- </div>
440
- </div>
424
+ args: [{ selector: 'fui-dialog-container', standalone: true, imports: [], template: `
425
+ <div
426
+ #dialogContainer
427
+ class="fui-dialog-container"
428
+ [class.fui-dialog-enter]="animationState() === 'enter'"
429
+ [class.fui-dialog-exit]="animationState() === 'exit'"
430
+ [attr.role]="config.role || 'dialog'"
431
+ [attr.aria-modal]="true"
432
+ [attr.aria-label]="config.ariaLabel"
433
+ [attr.aria-labelledby]="config.ariaLabelledBy"
434
+ [attr.aria-describedby]="config.ariaDescribedBy"
435
+ tabindex="-1"
436
+ >
437
+ <div class="fui-dialog-content" aria-live="polite">
438
+ <ng-content></ng-content>
439
+ </div>
440
+ </div>
441
441
  `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
442
442
  class: 'fui-dialog-container-host',
443
443
  }, styles: [":host{display:block;outline:0}.fui-dialog-container{display:flex;flex-direction:column;box-sizing:border-box;overflow:auto;outline:0;max-height:inherit;border:1px solid var(--fui-border-color);border-radius:var(--fui-border-radius-md);background:var(--fui-surface-00);box-shadow:var(--fui-dialog-box-shadow, var(--fui-shadow-05))}.fui-dialog-content{display:contents}.fui-dialog-enter{animation:fui-dialog-enter var(--fui-duration-moderate-02) var(--fui-ease-entrance)}.fui-dialog-exit{animation:fui-dialog-exit var(--fui-duration-moderate-01) var(--fui-ease-exit)}@keyframes fui-dialog-enter{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes fui-dialog-exit{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@media(prefers-reduced-motion:reduce){.fui-dialog-enter,.fui-dialog-exit{animation:none}}\n"] }]
@@ -470,7 +470,7 @@ class FuiConfirmDialogComponent {
470
470
  confirmButtonVariant = computed(() => {
471
471
  switch (this.variant) {
472
472
  case 'danger':
473
- return 'danger';
473
+ return 'destructive';
474
474
  case 'warning':
475
475
  return 'primary';
476
476
  default:
@@ -484,11 +484,11 @@ class FuiConfirmDialogComponent {
484
484
  this.dialogRef.close(false);
485
485
  }
486
486
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiConfirmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
487
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.6", type: FuiConfirmDialogComponent, isStandalone: true, selector: "fui-confirm-dialog", host: { classAttribute: "fui-confirm-dialog" }, ngImport: i0, template: "<div class=\"fui-confirm-dialog__header\">\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\n</div>\n\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\n</div>\n\n<div class=\"fui-confirm-dialog__actions\">\n <button fuiButton variant=\"ghost\" (click)=\"onCancel()\">{{ cancelText }}</button>\n <button fuiButton [variant]=\"confirmButtonVariant()\" (click)=\"onConfirm()\">{{ confirmText }}</button>\n</div>\n", styles: [".fui-confirm-dialog{display:flex;flex-direction:column;padding:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__header{display:flex;align-items:center;gap:var(--fui-gap-12, .75rem);margin-bottom:var(--fui-gap-16, 1rem)}.fui-confirm-dialog__icon{flex-shrink:0}.fui-confirm-dialog__icon--info{color:var(--fui-info)}.fui-confirm-dialog__icon--warning{color:var(--fui-warning)}.fui-confirm-dialog__icon--danger{color:var(--fui-danger)}.fui-confirm-dialog__title{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-04);font-weight:var(--fui-font-weight-semibold, 600);color:var(--fui-text-primary);margin:0}.fui-confirm-dialog__body{margin-bottom:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__message{font-size:var(--fui-font-size-02);color:var(--fui-text-secondary);line-height:1.5;margin:0}.fui-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:var(--fui-gap-8, .5rem)}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "directive", type: FuiButtonDirective, selector: "button[fuiButton], a[fuiButton]", inputs: ["variant", "size", "disabled", "fullWidth", "loading", "iconOnly", "aria-label", "type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
487
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.6", type: FuiConfirmDialogComponent, isStandalone: true, selector: "fui-confirm-dialog", host: { classAttribute: "fui-confirm-dialog" }, ngImport: i0, template: "<div class=\"fui-confirm-dialog__header\">\r\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\r\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\r\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__actions\">\r\n <button fuiButton variant=\"tertiary\" (click)=\"onCancel()\">{{ cancelText }}</button>\r\n <button fuiButton [variant]=\"confirmButtonVariant()\" (click)=\"onConfirm()\">{{ confirmText }}</button>\r\n</div>\r\n", styles: [".fui-confirm-dialog{display:flex;flex-direction:column;padding:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__header{display:flex;align-items:center;gap:var(--fui-gap-12, .75rem);margin-bottom:var(--fui-gap-16, 1rem)}.fui-confirm-dialog__icon{flex-shrink:0}.fui-confirm-dialog__icon--info{color:var(--fui-info)}.fui-confirm-dialog__icon--warning{color:var(--fui-warning)}.fui-confirm-dialog__icon--danger{color:var(--fui-danger)}.fui-confirm-dialog__title{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-04);font-weight:var(--fui-font-weight-semibold, 600);color:var(--fui-text-primary);margin:0}.fui-confirm-dialog__body{margin-bottom:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__message{font-size:var(--fui-font-size-02);color:var(--fui-text-secondary);line-height:1.5;margin:0}.fui-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:var(--fui-gap-8, .5rem)}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "directive", type: FuiButtonDirective, selector: "button[fuiButton], a[fuiButton]", inputs: ["variant", "size", "disabled", "fullWidth", "loading", "iconOnly", "aria-label", "type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
488
488
  }
489
489
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiConfirmDialogComponent, decorators: [{
490
490
  type: Component,
491
- args: [{ selector: 'fui-confirm-dialog', standalone: true, imports: [FuiIconComponent, FuiButtonDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'fui-confirm-dialog' }, template: "<div class=\"fui-confirm-dialog__header\">\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\n</div>\n\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\n</div>\n\n<div class=\"fui-confirm-dialog__actions\">\n <button fuiButton variant=\"ghost\" (click)=\"onCancel()\">{{ cancelText }}</button>\n <button fuiButton [variant]=\"confirmButtonVariant()\" (click)=\"onConfirm()\">{{ confirmText }}</button>\n</div>\n", styles: [".fui-confirm-dialog{display:flex;flex-direction:column;padding:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__header{display:flex;align-items:center;gap:var(--fui-gap-12, .75rem);margin-bottom:var(--fui-gap-16, 1rem)}.fui-confirm-dialog__icon{flex-shrink:0}.fui-confirm-dialog__icon--info{color:var(--fui-info)}.fui-confirm-dialog__icon--warning{color:var(--fui-warning)}.fui-confirm-dialog__icon--danger{color:var(--fui-danger)}.fui-confirm-dialog__title{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-04);font-weight:var(--fui-font-weight-semibold, 600);color:var(--fui-text-primary);margin:0}.fui-confirm-dialog__body{margin-bottom:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__message{font-size:var(--fui-font-size-02);color:var(--fui-text-secondary);line-height:1.5;margin:0}.fui-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:var(--fui-gap-8, .5rem)}\n"] }]
491
+ args: [{ selector: 'fui-confirm-dialog', standalone: true, imports: [FuiIconComponent, FuiButtonDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'fui-confirm-dialog' }, template: "<div class=\"fui-confirm-dialog__header\">\r\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\r\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\r\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__actions\">\r\n <button fuiButton variant=\"tertiary\" (click)=\"onCancel()\">{{ cancelText }}</button>\r\n <button fuiButton [variant]=\"confirmButtonVariant()\" (click)=\"onConfirm()\">{{ confirmText }}</button>\r\n</div>\r\n", styles: [".fui-confirm-dialog{display:flex;flex-direction:column;padding:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__header{display:flex;align-items:center;gap:var(--fui-gap-12, .75rem);margin-bottom:var(--fui-gap-16, 1rem)}.fui-confirm-dialog__icon{flex-shrink:0}.fui-confirm-dialog__icon--info{color:var(--fui-info)}.fui-confirm-dialog__icon--warning{color:var(--fui-warning)}.fui-confirm-dialog__icon--danger{color:var(--fui-danger)}.fui-confirm-dialog__title{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-04);font-weight:var(--fui-font-weight-semibold, 600);color:var(--fui-text-primary);margin:0}.fui-confirm-dialog__body{margin-bottom:var(--fui-padding-24, 1.5rem)}.fui-confirm-dialog__message{font-size:var(--fui-font-size-02);color:var(--fui-text-secondary);line-height:1.5;margin:0}.fui-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:var(--fui-gap-8, .5rem)}\n"] }]
492
492
  }] });
493
493
 
494
494
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-services-dialog.mjs","sources":["../../../lib/services/dialog/dialog.types.ts","../../../lib/services/dialog/dialog-ref.ts","../../../lib/services/dialog/dialog-container.component.ts","../../../lib/services/dialog/confirm-dialog.component.ts","../../../lib/services/dialog/confirm-dialog.component.html","../../../lib/services/dialog/dialog.service.ts","../../../lib/services/dialog/raintonic-formaui-services-dialog.ts"],"sourcesContent":["import { InjectionToken, Injector, Type, ViewContainerRef } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Injection token for dialog data passed to the dialog component\n */\nexport const FUI_DIALOG_DATA = new InjectionToken<unknown>('FuiDialogData');\n\n/**\n * Injection token for the dialog scroll strategy\n */\nexport const FUI_DIALOG_DEFAULT_OPTIONS = new InjectionToken<FuiDialogConfig>('FuiDialogDefaultOptions');\n\n/**\n * Role attribute for the dialog\n */\nexport type FuiDialogRole = 'dialog' | 'alertdialog';\n\n/**\n * Configuration for opening a dialog\n */\nexport interface FuiDialogConfig<D = unknown> {\n /** ID for the dialog. If omitted, a unique one will be generated */\n id?: string;\n\n /** Role attribute for the dialog element */\n role?: FuiDialogRole;\n\n /** CSS class(es) to apply to the overlay pane */\n panelClass?: string | string[];\n\n /** Whether the dialog has a backdrop */\n hasBackdrop?: boolean;\n\n /** CSS class(es) to apply to the backdrop */\n backdropClass?: string | string[];\n\n /** Whether the user can close the dialog by clicking on the backdrop */\n disableClose?: boolean;\n\n /** Width of the dialog */\n width?: string;\n\n /** Height of the dialog */\n height?: string;\n\n /** Min-width of the dialog */\n minWidth?: string | number;\n\n /** Min-height of the dialog */\n minHeight?: string | number;\n\n /** Max-width of the dialog. Defaults to 80vw */\n maxWidth?: string | number;\n\n /** Max-height of the dialog */\n maxHeight?: string | number;\n\n /** Position of the dialog */\n position?: FuiDialogPosition;\n\n /** Data to pass to the dialog component */\n data?: D | null;\n\n /** Layout direction for the dialog content */\n direction?: 'ltr' | 'rtl';\n\n /** ARIA label for the dialog */\n ariaLabel?: string | null;\n\n /** ID of the element that labels the dialog */\n ariaLabelledBy?: string | null;\n\n /** ID of the element that describes the dialog */\n ariaDescribedBy?: string | null;\n\n /** Whether to focus the first focusable element on open */\n autoFocus?: FuiAutoFocusTarget | string | boolean;\n\n /** Whether to restore focus to the previously focused element on close */\n restoreFocus?: boolean;\n\n /** Whether the dialog should close when the user goes backwards/forwards in history */\n closeOnNavigation?: boolean;\n\n /** Duration of the enter animation in ms */\n enterAnimationDuration?: string | number;\n\n /** Duration of the exit animation in ms */\n exitAnimationDuration?: string | number;\n\n /** Alternate ViewContainerRef to use for creating the dialog */\n viewContainerRef?: ViewContainerRef;\n\n /** Injector used for the dialog component */\n injector?: Injector;\n\n /** Component to instantiate as the dialog container (internal use) */\n containerComponent?: Type<FuiDialogContainerBase>;\n\n /** Whether to delay the focus trap */\n delayFocusTrap?: boolean;\n}\n\n/**\n * Target for auto focus within the dialog\n */\nexport type FuiAutoFocusTarget = 'dialog' | 'first-tabbable' | 'first-heading';\n\n/**\n * Position of the dialog\n */\nexport interface FuiDialogPosition {\n /** Override for the dialog's top position */\n top?: string;\n /** Override for the dialog's bottom position */\n bottom?: string;\n /** Override for the dialog's left position */\n left?: string;\n /** Override for the dialog's right position */\n right?: string;\n}\n\n/**\n * State of the dialog animation\n */\nexport type FuiDialogState = 'void' | 'enter' | 'exit';\n\n/**\n * Base interface for dialog container\n */\nexport interface FuiDialogContainerBase {\n /** Starts the dialog exit animation */\n _startExitAnimation(): void;\n}\n\n/**\n * Reference to an opened dialog\n */\nexport interface IFuiDialogRef<T = unknown, R = unknown> {\n /** Unique ID for this dialog instance */\n readonly id: string;\n\n /** The component instance if the dialog was created with a component */\n readonly componentInstance: T | null;\n\n /** Whether the user is allowed to close the dialog */\n disableClose: boolean;\n\n /** Observable that emits when the dialog has been opened */\n readonly afterOpened: Observable<void>;\n\n /** Observable that emits when the dialog has started closing */\n readonly beforeClosed: Observable<R | undefined>;\n\n /** Observable that emits when the dialog has finished closing */\n readonly afterClosed: Observable<R | undefined>;\n\n /** Observable that emits when the backdrop is clicked */\n readonly backdropClick: Observable<MouseEvent>;\n\n /** Observable that emits when a keydown event occurs on the overlay */\n readonly keydownEvents: Observable<KeyboardEvent>;\n\n /**\n * Closes the dialog with an optional result\n * @param dialogResult Result to return to the dialog opener\n */\n close(dialogResult?: R): void;\n\n /**\n * Updates the dialog's position\n * @param position New position configuration\n */\n updatePosition(position?: FuiDialogPosition): void;\n\n /**\n * Updates the dialog's dimensions\n * @param width New width\n * @param height New height\n */\n updateSize(width?: string, height?: string): void;\n\n /**\n * Adds CSS classes to the dialog panel\n * @param classes Classes to add\n */\n addPanelClass(classes: string | string[]): void;\n\n /**\n * Removes CSS classes from the dialog panel\n * @param classes Classes to remove\n */\n removePanelClass(classes: string | string[]): void;\n\n /**\n * Gets the current state of the dialog's lifecycle\n */\n getState(): FuiDialogState;\n}\n\n/**\n * Result from opening a dialog\n */\nexport interface FuiDialogOpenResult<T, R> {\n /** Reference to the opened dialog */\n dialogRef: IFuiDialogRef<T, R>;\n /** Reference to the component instance if dialog was created with a component */\n componentRef?: T;\n}\n\n// Confirm Dialog types\nexport type FuiConfirmDialogVariant = 'info' | 'warning' | 'danger';\n\nexport interface FuiConfirmDialogConfig {\n title: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n variant?: FuiConfirmDialogVariant;\n}\n","import { Observable, Subject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { FuiOverlayRef, FuiGlobalPositionStrategy } from '@raintonic/formaui/cdk/overlay';\nimport { FuiDialogConfig, FuiDialogPosition, IFuiDialogRef, FuiDialogState } from './dialog.types';\n\n/**\n * # FuiDialogRefImpl\n *\n * Implementation of the FuiDialogRef interface. This class manages the lifecycle\n * of an individual dialog instance, providing methods to close, update position/size,\n * and observe dialog events.\n *\n * ## Features\n * - Dialog result handling\n * - Position and size updates\n * - Event observables (backdrop click, keydown, lifecycle)\n * - CSS class management\n * - Focus management integration\n */\nexport class FuiDialogRef<T = unknown, R = unknown> implements IFuiDialogRef<T, R> {\n private readonly _id: string;\n private _componentInstance: T | null = null;\n private _result: R | undefined;\n private _state: FuiDialogState = 'enter';\n\n // Event subjects\n private readonly _afterOpened = new Subject<void>();\n private readonly _beforeClosed = new Subject<R | undefined>();\n private readonly _afterClosed = new Subject<R | undefined>();\n\n // Configuration\n disableClose: boolean;\n\n constructor(\n private readonly _overlayRef: FuiOverlayRef,\n private _config: FuiDialogConfig,\n id?: string,\n ) {\n this._id = id ?? this._generateId();\n this.disableClose = _config.disableClose ?? false;\n\n this._setupEventHandlers();\n }\n\n /** Unique ID for this dialog instance */\n get id(): string {\n return this._id;\n }\n\n /** The component instance if the dialog was created with a component */\n get componentInstance(): T | null {\n return this._componentInstance;\n }\n\n /** Sets the component instance (internal use) */\n set componentInstance(instance: T | null) {\n this._componentInstance = instance;\n }\n\n /** Observable that emits when the dialog has been opened */\n get afterOpened(): Observable<void> {\n return this._afterOpened.asObservable();\n }\n\n /** Observable that emits when the dialog has started closing */\n get beforeClosed(): Observable<R | undefined> {\n return this._beforeClosed.asObservable();\n }\n\n /** Observable that emits when the dialog has finished closing */\n get afterClosed(): Observable<R | undefined> {\n return this._afterClosed.asObservable();\n }\n\n /** Observable that emits when the backdrop is clicked */\n get backdropClick(): Observable<MouseEvent> {\n return this._overlayRef.backdropClick;\n }\n\n /** Observable that emits when a keydown event occurs on the overlay */\n get keydownEvents(): Observable<KeyboardEvent> {\n return this._overlayRef.keydownEvents;\n }\n\n /**\n * Closes the dialog with an optional result\n */\n close(dialogResult?: R): void {\n if (this._state === 'exit') {\n return;\n }\n\n this._result = dialogResult;\n this._state = 'exit';\n\n // Emit before closed event\n this._beforeClosed.next(dialogResult);\n this._beforeClosed.complete();\n\n // Get animation duration from config\n const exitDuration = this._parseAnimationDuration(this._config.exitAnimationDuration);\n\n if (exitDuration > 0) {\n // Add exit animation class\n this._overlayRef.addPanelClass('fui-dialog-exit');\n\n // Wait for animation then dispose\n setTimeout(() => {\n this._finishDialogClose();\n }, exitDuration);\n } else {\n this._finishDialogClose();\n }\n }\n\n /**\n * Updates the dialog's position\n */\n updatePosition(position?: FuiDialogPosition): void {\n const strategy = this._overlayRef.getConfig().positionStrategy as FuiGlobalPositionStrategy;\n\n if (strategy) {\n if (position?.left || position?.right) {\n if (position?.left) {\n strategy.left(position.left);\n } else if (position?.right) {\n strategy.right(position.right);\n }\n } else {\n strategy.centerHorizontally();\n }\n\n if (position?.top || position?.bottom) {\n if (position?.top) {\n strategy.top(position.top);\n } else if (position?.bottom) {\n strategy.bottom(position.bottom);\n }\n } else {\n strategy.centerVertically();\n }\n\n this._overlayRef.updatePosition();\n }\n }\n\n /**\n * Updates the dialog's dimensions\n */\n updateSize(width?: string, height?: string): void {\n this._overlayRef.updateSize({\n width: width ?? undefined,\n height: height ?? undefined,\n });\n }\n\n /**\n * Adds CSS classes to the dialog panel\n */\n addPanelClass(classes: string | string[]): void {\n this._overlayRef.addPanelClass(classes);\n }\n\n /**\n * Removes CSS classes from the dialog panel\n */\n removePanelClass(classes: string | string[]): void {\n this._overlayRef.removePanelClass(classes);\n }\n\n /**\n * Gets the current state of the dialog's lifecycle\n */\n getState(): FuiDialogState {\n return this._state;\n }\n\n /**\n * Notifies that the dialog has been opened (internal use)\n */\n _notifyOpened(): void {\n this._afterOpened.next();\n this._afterOpened.complete();\n }\n\n private _setupEventHandlers(): void {\n // Handle backdrop clicks\n this._overlayRef.backdropClick.subscribe(() => {\n if (!this.disableClose) {\n this.close();\n }\n });\n\n // Handle escape key\n this._overlayRef.keydownEvents\n .pipe(filter((event) => event.key === 'Escape' && !this.disableClose))\n .subscribe((event) => {\n event.preventDefault();\n this.close();\n });\n }\n\n private _finishDialogClose(): void {\n // Dispose the overlay\n this._overlayRef.dispose();\n\n // Emit after closed event\n this._afterClosed.next(this._result);\n this._afterClosed.complete();\n }\n\n private _parseAnimationDuration(duration: string | number | undefined): number {\n if (duration === undefined) {\n return 200; // Default 200ms\n }\n\n if (typeof duration === 'number') {\n return duration;\n }\n\n // Parse CSS duration string (e.g., '200ms', '0.2s')\n const match = /^(\\d+(?:\\.\\d+)?)(ms|s)$/.exec(duration);\n if (match) {\n const value = parseFloat(match[1]);\n const unit = match[2];\n return unit === 's' ? value * 1000 : value;\n }\n\n return 200;\n }\n\n private _generateId(): string {\n return `fui-dialog-${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n","import {\n Component,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n inject,\n ChangeDetectionStrategy,\n signal,\n computed,\n HostListener,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { FuiDialogConfig, FuiDialogContainerBase } from './dialog.types';\n\n/**\n * # FuiDialogContainerComponent\n *\n * Internal container component that hosts the dialog content. This component\n * handles focus trapping, animations, and accessibility attributes.\n *\n * ## Features\n * - Focus trapping within the dialog\n * - Configurable ARIA attributes\n * - Enter/exit animations\n * - Focus restoration on close\n */\n@Component({\n selector: 'fui-dialog-container',\n standalone: true,\n imports: [],\n template: `\n <div\n #dialogContainer\n class=\"fui-dialog-container\"\n [class.fui-dialog-enter]=\"animationState() === 'enter'\"\n [class.fui-dialog-exit]=\"animationState() === 'exit'\"\n [attr.role]=\"config.role || 'dialog'\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"config.ariaLabel\"\n [attr.aria-labelledby]=\"config.ariaLabelledBy\"\n [attr.aria-describedby]=\"config.ariaDescribedBy\"\n tabindex=\"-1\"\n >\n <div class=\"fui-dialog-content\" aria-live=\"polite\">\n <ng-content></ng-content>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n outline: 0;\n }\n\n .fui-dialog-container {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n overflow: auto;\n outline: 0;\n max-height: inherit;\n border: 1px solid var(--fui-border-color);\n border-radius: var(--fui-border-radius-md);\n background: var(--fui-surface-00);\n box-shadow: var(--fui-dialog-box-shadow, var(--fui-shadow-05));\n }\n\n .fui-dialog-content {\n display: contents;\n }\n\n .fui-dialog-enter {\n animation: fui-dialog-enter var(--fui-duration-moderate-02) var(--fui-ease-entrance);\n }\n\n .fui-dialog-exit {\n animation: fui-dialog-exit var(--fui-duration-moderate-01) var(--fui-ease-exit);\n }\n\n @keyframes fui-dialog-enter {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes fui-dialog-exit {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .fui-dialog-enter,\n .fui-dialog-exit {\n animation: none;\n }\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'fui-dialog-container-host',\n },\n})\nexport class FuiDialogContainerComponent implements FuiDialogContainerBase, AfterViewInit, OnDestroy {\n private readonly _document = inject(DOCUMENT);\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\n\n @ViewChild('dialogContainer', { static: true })\n private _dialogContainer!: ElementRef<HTMLElement>;\n\n /** Configuration for the dialog */\n config!: FuiDialogConfig;\n\n /** The previously focused element before the dialog was opened */\n private _elementFocusedBeforeDialogWasOpened: HTMLElement | null = null;\n\n /** Animation state of the dialog */\n readonly animationState = signal<'void' | 'enter' | 'exit'>('void');\n\n /** Whether the dialog is currently animating */\n readonly isAnimating = computed(() => this.animationState() !== 'void');\n\n ngAfterViewInit(): void {\n this._trapFocus();\n }\n\n ngOnDestroy(): void {\n this._restoreFocus();\n }\n\n /**\n * Handles keydown events for focus trap cycling within the dialog.\n * Tab loops from last to first focusable element, Shift+Tab from first to last.\n */\n @HostListener('keydown', ['$event'])\n _onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Tab') {\n const focusableElements = this._getFocusableElements();\n if (focusableElements.length === 0) {\n event.preventDefault();\n return;\n }\n\n const firstFocusable = focusableElements[0];\n const lastFocusable = focusableElements[focusableElements.length - 1];\n const activeElement = this._document.activeElement;\n\n if (event.shiftKey) {\n // Shift+Tab: if on first element, wrap to last\n if (activeElement === firstFocusable || activeElement === this._dialogContainer.nativeElement) {\n event.preventDefault();\n lastFocusable.focus();\n }\n } else {\n // Tab: if on last element, wrap to first\n if (activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable.focus();\n }\n }\n }\n }\n\n /**\n * Initializes the dialog container with the given configuration\n */\n _initializeWithConfig(config: FuiDialogConfig): void {\n this.config = config;\n }\n\n /**\n * Starts the enter animation\n */\n _startEnterAnimation(): void {\n this.animationState.set('enter');\n }\n\n /**\n * Starts the exit animation\n */\n _startExitAnimation(): void {\n this.animationState.set('exit');\n }\n\n /**\n * Gets the native element of the container\n */\n _getHostElement(): HTMLElement {\n return this._elementRef.nativeElement;\n }\n\n /**\n * Saves the element that was focused before the dialog opened and traps focus\n */\n private _trapFocus(): void {\n // Store the currently focused element\n this._elementFocusedBeforeDialogWasOpened = this._document.activeElement as HTMLElement;\n\n // Focus the dialog container\n const autoFocus = this.config?.autoFocus ?? 'first-tabbable';\n\n if (autoFocus === false || autoFocus === 'dialog') {\n // Focus the dialog container itself\n this._dialogContainer.nativeElement.focus();\n } else if (autoFocus === 'first-tabbable') {\n this._focusFirstTabbableElement();\n } else if (autoFocus === 'first-heading') {\n this._focusFirstHeading();\n } else if (typeof autoFocus === 'string') {\n // Focus a specific element by selector\n this._focusBySelector(autoFocus);\n } else {\n // Default: focus first tabbable\n this._focusFirstTabbableElement();\n }\n }\n\n /**\n * Focuses the first tabbable element within the dialog\n */\n private _focusFirstTabbableElement(): void {\n const focusableElements = this._getFocusableElements();\n if (focusableElements.length > 0) {\n focusableElements[0].focus();\n } else {\n // Fallback to container\n this._dialogContainer.nativeElement.focus();\n }\n }\n\n /**\n * Focuses the first heading element within the dialog\n */\n private _focusFirstHeading(): void {\n const heading = this._dialogContainer.nativeElement.querySelector<HTMLElement>(\n 'h1, h2, h3, h4, h5, h6, [role=\"heading\"]',\n );\n\n if (heading) {\n // Make heading focusable if it's not already\n if (!heading.hasAttribute('tabindex')) {\n heading.setAttribute('tabindex', '-1');\n }\n heading.focus();\n } else {\n this._focusFirstTabbableElement();\n }\n }\n\n /**\n * Focuses an element matching the given selector\n */\n private _focusBySelector(selector: string): void {\n const element = this._dialogContainer.nativeElement.querySelector<HTMLElement>(selector);\n if (element) {\n element.focus();\n } else {\n this._focusFirstTabbableElement();\n }\n }\n\n /**\n * Gets all focusable elements within the dialog\n */\n private _getFocusableElements(): HTMLElement[] {\n const focusableSelectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n ].join(',');\n\n return Array.from(this._dialogContainer.nativeElement.querySelectorAll<HTMLElement>(focusableSelectors)).filter(\n (el) => {\n // Filter out elements that are not visible\n return el.offsetParent !== null;\n },\n );\n }\n\n /**\n * Restores focus to the element that was focused before the dialog opened\n */\n private _restoreFocus(): void {\n const shouldRestoreFocus = this.config?.restoreFocus !== false;\n\n if (shouldRestoreFocus && this._elementFocusedBeforeDialogWasOpened) {\n // Check if the element is still in the DOM and can receive focus\n if (typeof this._elementFocusedBeforeDialogWasOpened.focus === 'function') {\n this._elementFocusedBeforeDialogWasOpened.focus();\n }\n }\n\n this._elementFocusedBeforeDialogWasOpened = null;\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject } from '@angular/core';\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\nimport { FuiButtonDirective } from '@raintonic/formaui/components/button';\nimport { FUI_DIALOG_DATA, FuiConfirmDialogConfig } from './dialog.types';\nimport { FuiDialogRef } from './dialog-ref';\n\n@Component({\n selector: 'fui-confirm-dialog',\n standalone: true,\n imports: [FuiIconComponent, FuiButtonDirective],\n templateUrl: './confirm-dialog.component.html',\n styleUrls: ['./confirm-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'fui-confirm-dialog' },\n})\nexport class FuiConfirmDialogComponent {\n private readonly data = inject(FUI_DIALOG_DATA) as FuiConfirmDialogConfig;\n private readonly dialogRef = inject(FuiDialogRef);\n\n readonly title = this.data.title;\n readonly message = this.data.message;\n readonly confirmText = this.data.confirmText ?? 'Confirm';\n readonly cancelText = this.data.cancelText ?? 'Cancel';\n readonly variant = this.data.variant ?? 'info';\n\n readonly icon = computed(() => {\n switch (this.variant) {\n case 'warning':\n return 'warning-diamond';\n case 'danger':\n return 'warning-octagon';\n default:\n return 'info';\n }\n });\n\n readonly confirmButtonVariant = computed(() => {\n switch (this.variant) {\n case 'danger':\n return 'danger';\n case 'warning':\n return 'primary';\n default:\n return 'primary';\n }\n });\n\n onConfirm(): void {\n this.dialogRef.close(true);\n }\n\n onCancel(): void {\n this.dialogRef.close(false);\n }\n}\n","<div class=\"fui-confirm-dialog__header\">\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\n</div>\n\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\n</div>\n\n<div class=\"fui-confirm-dialog__actions\">\n <button fuiButton variant=\"ghost\" (click)=\"onCancel()\">{{ cancelText }}</button>\n <button fuiButton [variant]=\"confirmButtonVariant()\" (click)=\"onConfirm()\">{{ confirmText }}</button>\n</div>\n","import {\n Injectable,\n Injector,\n ComponentRef,\n TemplateRef,\n Type,\n createComponent,\n EnvironmentInjector,\n inject,\n EmbeddedViewRef,\n StaticProvider,\n ApplicationRef,\n} from '@angular/core';\nimport { Observable, Subject, defer } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\nimport { FuiOverlayService, FuiOverlayRef, FuiOverlayConfig } from '@raintonic/formaui/cdk/overlay';\nimport { FuiDialogConfig, IFuiDialogRef, FUI_DIALOG_DATA, FuiConfirmDialogConfig } from './dialog.types';\nimport { FuiDialogRef } from './dialog-ref';\nimport { FuiDialogContainerComponent } from './dialog-container.component';\nimport { FuiConfirmDialogComponent } from './confirm-dialog.component';\n\n/**\n * # FuiDialogService\n *\n * Service for opening modal dialogs. This service provides a comprehensive\n * dialog system similar to Angular Material's MatDialog, built on top of\n * the FuiOverlayService.\n *\n * ## Features\n * - Open dialogs with components or templates\n * - Pass data to dialog components\n * - Configure positioning, sizing, and behavior\n * - Get results from dialogs via observables\n * - Manage multiple open dialogs\n * - Automatic focus management and accessibility\n *\n * ## Usage\n *\n * ### Opening a Component Dialog\n * ```typescript\n * const dialogRef = this.dialog.open(MyDialogComponent, {\n * width: '400px',\n * data: { name: 'John' }\n * });\n *\n * dialogRef.afterClosed().subscribe(result => {\n * console.log('Dialog result:', result);\n * });\n * ```\n *\n * ### Opening a Template Dialog\n * ```typescript\n * const dialogRef = this.dialog.open(myTemplateRef, {\n * width: '300px',\n * hasBackdrop: true\n * });\n * ```\n *\n * ### Accessing Data in Dialog Component\n * ```typescript\n * export class MyDialogComponent {\n * private readonly data = inject(FUI_DIALOG_DATA);\n * private readonly dialogRef = inject(FuiDialogRef);\n *\n * onClose() {\n * this.dialogRef.close('result');\n * }\n * }\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FuiDialogService {\n private readonly _overlayService = inject(FuiOverlayService);\n private readonly _environmentInjector = inject(EnvironmentInjector);\n private readonly _injector = inject(Injector);\n private readonly _appRef = inject(ApplicationRef);\n\n private readonly _openDialogs: IFuiDialogRef[] = [];\n private readonly _afterOpenedSubject = new Subject<IFuiDialogRef>();\n private readonly _afterAllClosedSubject = new Subject<void>();\n\n private _nextUniqueId = 0;\n\n /**\n * Observable that emits when a dialog is opened\n */\n readonly afterOpened: Observable<IFuiDialogRef> = this._afterOpenedSubject.asObservable();\n\n /**\n * Observable that emits when all dialogs are closed\n */\n readonly afterAllClosed: Observable<void> = defer(() =>\n this._openDialogs.length ? this._getAfterAllClosed() : this._getAfterAllClosed().pipe(startWith(undefined)),\n );\n\n /**\n * Gets all currently open dialogs\n */\n get openDialogs(): IFuiDialogRef[] {\n return this._openDialogs.slice();\n }\n\n /**\n * Opens a dialog containing the given component or template\n * @param componentOrTemplateRef Component type or TemplateRef to display\n * @param config Configuration options for the dialog\n * @returns Reference to the opened dialog\n */\n open<T, D = unknown, R = unknown>(\n componentOrTemplateRef: Type<T> | TemplateRef<T>,\n config?: FuiDialogConfig<D>,\n ): FuiDialogRef<T, R> {\n const mergedConfig = this._applyConfigDefaults(config);\n const overlayRef = this._createOverlay(mergedConfig);\n const dialogContainer = this._attachDialogContainer(overlayRef, mergedConfig);\n const dialogRef = this._createDialogRef<T, R>(overlayRef, dialogContainer, mergedConfig);\n\n if (componentOrTemplateRef instanceof TemplateRef) {\n this._attachTemplateContent(dialogContainer, componentOrTemplateRef, dialogRef);\n } else {\n const componentRef = this._attachComponentContent<T, R>(\n dialogContainer,\n componentOrTemplateRef,\n dialogRef,\n mergedConfig,\n );\n dialogRef.componentInstance = componentRef.instance;\n }\n\n // Track open dialogs\n this._openDialogs.push(dialogRef);\n\n // Handle dialog close\n dialogRef.afterClosed.subscribe(() => {\n this._removeOpenDialog(dialogRef);\n });\n\n // Start enter animation and notify opened\n dialogContainer._startEnterAnimation();\n\n // Notify that dialog has been opened\n requestAnimationFrame(() => {\n dialogRef._notifyOpened();\n this._afterOpenedSubject.next(dialogRef);\n });\n\n return dialogRef;\n }\n\n /**\n * Closes all open dialogs\n */\n closeAll(): void {\n const dialogs = this._openDialogs.slice();\n dialogs.forEach((dialog) => {\n dialog.close();\n });\n }\n\n /**\n * Gets a dialog by its ID\n * @param id Dialog ID\n * @returns The dialog reference or undefined\n */\n getDialogById(id: string): IFuiDialogRef | undefined {\n return this._openDialogs.find((dialog) => dialog.id === id);\n }\n\n private _createOverlay(config: FuiDialogConfig): FuiOverlayRef {\n const overlayConfig = this._getOverlayConfig(config);\n return this._overlayService.create(overlayConfig);\n }\n\n private _getOverlayConfig(config: FuiDialogConfig): FuiOverlayConfig {\n // Create position strategy\n const positionStrategy = this._overlayService.position().global();\n\n // Apply positioning\n if (config.position?.left || config.position?.right) {\n if (config.position.left) {\n positionStrategy.left(config.position.left);\n } else if (config.position.right) {\n positionStrategy.right(config.position.right);\n }\n } else {\n positionStrategy.centerHorizontally();\n }\n\n if (config.position?.top || config.position?.bottom) {\n if (config.position.top) {\n positionStrategy.top(config.position.top);\n } else if (config.position.bottom) {\n positionStrategy.bottom(config.position.bottom);\n }\n } else {\n positionStrategy.centerVertically();\n }\n\n return {\n positionStrategy,\n scrollStrategy: this._overlayService.scrollStrategies.block(),\n hasBackdrop: config.hasBackdrop ?? true,\n backdropClass: this._getBackdropClass(config),\n backdropClickBehavior: config.disableClose ? 'ignore' : 'close',\n panelClass: this._getPanelClass(config),\n width: config.width,\n height: config.height,\n minWidth: config.minWidth,\n minHeight: config.minHeight,\n maxWidth: config.maxWidth,\n maxHeight: config.maxHeight,\n direction: config.direction,\n };\n }\n\n private _getBackdropClass(config: FuiDialogConfig): string[] {\n const baseClass = 'fui-dialog-backdrop';\n let customClasses: string[] = [];\n if (config.backdropClass) {\n customClasses = Array.isArray(config.backdropClass) ? config.backdropClass : [config.backdropClass];\n }\n\n return [baseClass, ...customClasses];\n }\n\n private _getPanelClass(config: FuiDialogConfig): string[] {\n const baseClass = 'fui-dialog-panel';\n let customPanelClasses: string[] = [];\n if (config.panelClass) {\n customPanelClasses = Array.isArray(config.panelClass) ? config.panelClass : [config.panelClass];\n }\n\n return [baseClass, ...customPanelClasses];\n }\n\n private _attachDialogContainer(overlayRef: FuiOverlayRef, config: FuiDialogConfig): FuiDialogContainerComponent {\n const containerRef = createComponent(FuiDialogContainerComponent, {\n environmentInjector: this._environmentInjector,\n });\n\n // Initialize the container with config\n containerRef.instance._initializeWithConfig(config);\n\n // Trigger change detection\n containerRef.changeDetectorRef.detectChanges();\n\n // Attach to overlay\n overlayRef.attach(containerRef);\n\n return containerRef.instance;\n }\n\n private _createDialogRef<T, R>(\n overlayRef: FuiOverlayRef,\n container: FuiDialogContainerComponent,\n config: FuiDialogConfig,\n ): FuiDialogRef<T, R> {\n const dialogId = config.id ?? `fui-dialog-${this._nextUniqueId++}`;\n return new FuiDialogRef<T, R>(overlayRef, config, dialogId);\n }\n\n private _attachComponentContent<T, R>(\n container: FuiDialogContainerComponent,\n component: Type<T>,\n dialogRef: FuiDialogRef<T, R>,\n config: FuiDialogConfig,\n ): ComponentRef<T> {\n // Create custom injector with dialog data and ref\n const providers: StaticProvider[] = [\n { provide: FUI_DIALOG_DATA, useValue: config.data },\n { provide: FuiDialogRef, useValue: dialogRef },\n ];\n\n const injector = Injector.create({\n parent: config.injector ?? this._injector,\n providers,\n });\n\n // Create the component\n const componentRef = createComponent(component, {\n environmentInjector: this._environmentInjector,\n elementInjector: injector,\n });\n\n // Attach to ApplicationRef to connect it to Angular's change detection tree\n // This is crucial for form controls and event bindings to work properly\n this._appRef.attachView(componentRef.hostView);\n\n // Append to container\n const hostElement = container._getHostElement();\n const containerElement = hostElement.querySelector('.fui-dialog-container');\n if (containerElement) {\n containerElement.appendChild(componentRef.location.nativeElement);\n }\n\n // Trigger change detection\n componentRef.changeDetectorRef.detectChanges();\n\n return componentRef;\n }\n\n private _attachTemplateContent<T, R>(\n container: FuiDialogContainerComponent,\n template: TemplateRef<T>,\n dialogRef: FuiDialogRef<T, R>,\n ): EmbeddedViewRef<T> {\n // Create the embedded view\n const context = { $implicit: dialogRef } as Record<string, unknown>;\n const viewRef = template.createEmbeddedView(context as T);\n\n // Attach to ApplicationRef to connect it to Angular's change detection tree\n this._appRef.attachView(viewRef);\n\n // Append to container\n const hostElement = container._getHostElement();\n const containerElement = hostElement.querySelector('.fui-dialog-container');\n if (containerElement) {\n viewRef.rootNodes.forEach((node) => {\n containerElement.appendChild(node);\n });\n }\n\n // Mark for check\n viewRef.detectChanges();\n\n return viewRef;\n }\n\n private _removeOpenDialog(dialogRef: IFuiDialogRef): void {\n const index = this._openDialogs.indexOf(dialogRef);\n if (index > -1) {\n this._openDialogs.splice(index, 1);\n\n // Emit if all dialogs are closed\n if (this._openDialogs.length === 0) {\n this._afterAllClosedSubject.next();\n }\n }\n }\n\n private _getAfterAllClosed(): Observable<void> {\n return this._afterAllClosedSubject.asObservable();\n }\n\n /**\n * Opens a confirmation dialog and returns an Observable<boolean>.\n * Resolves to `true` when confirmed, `false` when cancelled, ESC, or backdrop click.\n */\n confirm(config: FuiConfirmDialogConfig): Observable<boolean> {\n const dialogRef = this.open(FuiConfirmDialogComponent, {\n width: '28rem',\n maxWidth: '90vw',\n data: config,\n role: config.variant === 'danger' ? 'alertdialog' : 'dialog',\n ariaLabelledBy: 'confirm-dialog-title',\n ariaDescribedBy: 'confirm-dialog-description',\n disableClose: false,\n });\n\n return dialogRef.afterClosed.pipe(map((result) => result === true));\n }\n\n private _applyConfigDefaults(config?: FuiDialogConfig): FuiDialogConfig {\n return {\n role: 'dialog',\n hasBackdrop: true,\n disableClose: false,\n maxWidth: '80vw',\n autoFocus: 'first-tabbable',\n restoreFocus: true,\n closeOnNavigation: true,\n enterAnimationDuration: 200,\n exitAnimationDuration: 150,\n ...config,\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raintonic-formaui-services-dialog.mjs","sources":["../../../lib/services/dialog/dialog.types.ts","../../../lib/services/dialog/dialog-ref.ts","../../../lib/services/dialog/dialog-container.component.ts","../../../lib/services/dialog/confirm-dialog.component.ts","../../../lib/services/dialog/confirm-dialog.component.html","../../../lib/services/dialog/dialog.service.ts","../../../lib/services/dialog/raintonic-formaui-services-dialog.ts"],"sourcesContent":["import { InjectionToken, Injector, Type, ViewContainerRef } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Injection token for dialog data passed to the dialog component\r\n */\r\nexport const FUI_DIALOG_DATA = new InjectionToken<unknown>('FuiDialogData');\r\n\r\n/**\r\n * Injection token for the dialog scroll strategy\r\n */\r\nexport const FUI_DIALOG_DEFAULT_OPTIONS = new InjectionToken<FuiDialogConfig>('FuiDialogDefaultOptions');\r\n\r\n/**\r\n * Role attribute for the dialog\r\n */\r\nexport type FuiDialogRole = 'dialog' | 'alertdialog';\r\n\r\n/**\r\n * Configuration for opening a dialog\r\n */\r\nexport interface FuiDialogConfig<D = unknown> {\r\n /** ID for the dialog. If omitted, a unique one will be generated */\r\n id?: string;\r\n\r\n /** Role attribute for the dialog element */\r\n role?: FuiDialogRole;\r\n\r\n /** CSS class(es) to apply to the overlay pane */\r\n panelClass?: string | string[];\r\n\r\n /** Whether the dialog has a backdrop */\r\n hasBackdrop?: boolean;\r\n\r\n /** CSS class(es) to apply to the backdrop */\r\n backdropClass?: string | string[];\r\n\r\n /** Whether the user can close the dialog by clicking on the backdrop */\r\n disableClose?: boolean;\r\n\r\n /** Width of the dialog */\r\n width?: string;\r\n\r\n /** Height of the dialog */\r\n height?: string;\r\n\r\n /** Min-width of the dialog */\r\n minWidth?: string | number;\r\n\r\n /** Min-height of the dialog */\r\n minHeight?: string | number;\r\n\r\n /** Max-width of the dialog. Defaults to 80vw */\r\n maxWidth?: string | number;\r\n\r\n /** Max-height of the dialog */\r\n maxHeight?: string | number;\r\n\r\n /** Position of the dialog */\r\n position?: FuiDialogPosition;\r\n\r\n /** Data to pass to the dialog component */\r\n data?: D | null;\r\n\r\n /** Layout direction for the dialog content */\r\n direction?: 'ltr' | 'rtl';\r\n\r\n /** ARIA label for the dialog */\r\n ariaLabel?: string | null;\r\n\r\n /** ID of the element that labels the dialog */\r\n ariaLabelledBy?: string | null;\r\n\r\n /** ID of the element that describes the dialog */\r\n ariaDescribedBy?: string | null;\r\n\r\n /** Whether to focus the first focusable element on open */\r\n autoFocus?: FuiAutoFocusTarget | string | boolean;\r\n\r\n /** Whether to restore focus to the previously focused element on close */\r\n restoreFocus?: boolean;\r\n\r\n /** Whether the dialog should close when the user goes backwards/forwards in history */\r\n closeOnNavigation?: boolean;\r\n\r\n /** Duration of the enter animation in ms */\r\n enterAnimationDuration?: string | number;\r\n\r\n /** Duration of the exit animation in ms */\r\n exitAnimationDuration?: string | number;\r\n\r\n /** Alternate ViewContainerRef to use for creating the dialog */\r\n viewContainerRef?: ViewContainerRef;\r\n\r\n /** Injector used for the dialog component */\r\n injector?: Injector;\r\n\r\n /** Component to instantiate as the dialog container (internal use) */\r\n containerComponent?: Type<FuiDialogContainerBase>;\r\n\r\n /** Whether to delay the focus trap */\r\n delayFocusTrap?: boolean;\r\n}\r\n\r\n/**\r\n * Target for auto focus within the dialog\r\n */\r\nexport type FuiAutoFocusTarget = 'dialog' | 'first-tabbable' | 'first-heading';\r\n\r\n/**\r\n * Position of the dialog\r\n */\r\nexport interface FuiDialogPosition {\r\n /** Override for the dialog's top position */\r\n top?: string;\r\n /** Override for the dialog's bottom position */\r\n bottom?: string;\r\n /** Override for the dialog's left position */\r\n left?: string;\r\n /** Override for the dialog's right position */\r\n right?: string;\r\n}\r\n\r\n/**\r\n * State of the dialog animation\r\n */\r\nexport type FuiDialogState = 'void' | 'enter' | 'exit';\r\n\r\n/**\r\n * Base interface for dialog container\r\n */\r\nexport interface FuiDialogContainerBase {\r\n /** Starts the dialog exit animation */\r\n _startExitAnimation(): void;\r\n}\r\n\r\n/**\r\n * Reference to an opened dialog\r\n */\r\nexport interface IFuiDialogRef<T = unknown, R = unknown> {\r\n /** Unique ID for this dialog instance */\r\n readonly id: string;\r\n\r\n /** The component instance if the dialog was created with a component */\r\n readonly componentInstance: T | null;\r\n\r\n /** Whether the user is allowed to close the dialog */\r\n disableClose: boolean;\r\n\r\n /** Observable that emits when the dialog has been opened */\r\n readonly afterOpened: Observable<void>;\r\n\r\n /** Observable that emits when the dialog has started closing */\r\n readonly beforeClosed: Observable<R | undefined>;\r\n\r\n /** Observable that emits when the dialog has finished closing */\r\n readonly afterClosed: Observable<R | undefined>;\r\n\r\n /** Observable that emits when the backdrop is clicked */\r\n readonly backdropClick: Observable<MouseEvent>;\r\n\r\n /** Observable that emits when a keydown event occurs on the overlay */\r\n readonly keydownEvents: Observable<KeyboardEvent>;\r\n\r\n /**\r\n * Closes the dialog with an optional result\r\n * @param dialogResult Result to return to the dialog opener\r\n */\r\n close(dialogResult?: R): void;\r\n\r\n /**\r\n * Updates the dialog's position\r\n * @param position New position configuration\r\n */\r\n updatePosition(position?: FuiDialogPosition): void;\r\n\r\n /**\r\n * Updates the dialog's dimensions\r\n * @param width New width\r\n * @param height New height\r\n */\r\n updateSize(width?: string, height?: string): void;\r\n\r\n /**\r\n * Adds CSS classes to the dialog panel\r\n * @param classes Classes to add\r\n */\r\n addPanelClass(classes: string | string[]): void;\r\n\r\n /**\r\n * Removes CSS classes from the dialog panel\r\n * @param classes Classes to remove\r\n */\r\n removePanelClass(classes: string | string[]): void;\r\n\r\n /**\r\n * Gets the current state of the dialog's lifecycle\r\n */\r\n getState(): FuiDialogState;\r\n}\r\n\r\n/**\r\n * Result from opening a dialog\r\n */\r\nexport interface FuiDialogOpenResult<T, R> {\r\n /** Reference to the opened dialog */\r\n dialogRef: IFuiDialogRef<T, R>;\r\n /** Reference to the component instance if dialog was created with a component */\r\n componentRef?: T;\r\n}\r\n\r\n// Confirm Dialog types\r\nexport type FuiConfirmDialogVariant = 'info' | 'warning' | 'danger';\r\n\r\nexport interface FuiConfirmDialogConfig {\r\n title: string;\r\n message: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n variant?: FuiConfirmDialogVariant;\r\n}\r\n","import { Observable, Subject } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { FuiOverlayRef, FuiGlobalPositionStrategy } from '@raintonic/formaui/cdk/overlay';\r\nimport { FuiDialogConfig, FuiDialogPosition, IFuiDialogRef, FuiDialogState } from './dialog.types';\r\n\r\n/**\r\n * # FuiDialogRefImpl\r\n *\r\n * Implementation of the FuiDialogRef interface. This class manages the lifecycle\r\n * of an individual dialog instance, providing methods to close, update position/size,\r\n * and observe dialog events.\r\n *\r\n * ## Features\r\n * - Dialog result handling\r\n * - Position and size updates\r\n * - Event observables (backdrop click, keydown, lifecycle)\r\n * - CSS class management\r\n * - Focus management integration\r\n */\r\nexport class FuiDialogRef<T = unknown, R = unknown> implements IFuiDialogRef<T, R> {\r\n private readonly _id: string;\r\n private _componentInstance: T | null = null;\r\n private _result: R | undefined;\r\n private _state: FuiDialogState = 'enter';\r\n\r\n // Event subjects\r\n private readonly _afterOpened = new Subject<void>();\r\n private readonly _beforeClosed = new Subject<R | undefined>();\r\n private readonly _afterClosed = new Subject<R | undefined>();\r\n\r\n // Configuration\r\n disableClose: boolean;\r\n\r\n constructor(\r\n private readonly _overlayRef: FuiOverlayRef,\r\n private _config: FuiDialogConfig,\r\n id?: string,\r\n ) {\r\n this._id = id ?? this._generateId();\r\n this.disableClose = _config.disableClose ?? false;\r\n\r\n this._setupEventHandlers();\r\n }\r\n\r\n /** Unique ID for this dialog instance */\r\n get id(): string {\r\n return this._id;\r\n }\r\n\r\n /** The component instance if the dialog was created with a component */\r\n get componentInstance(): T | null {\r\n return this._componentInstance;\r\n }\r\n\r\n /** Sets the component instance (internal use) */\r\n set componentInstance(instance: T | null) {\r\n this._componentInstance = instance;\r\n }\r\n\r\n /** Observable that emits when the dialog has been opened */\r\n get afterOpened(): Observable<void> {\r\n return this._afterOpened.asObservable();\r\n }\r\n\r\n /** Observable that emits when the dialog has started closing */\r\n get beforeClosed(): Observable<R | undefined> {\r\n return this._beforeClosed.asObservable();\r\n }\r\n\r\n /** Observable that emits when the dialog has finished closing */\r\n get afterClosed(): Observable<R | undefined> {\r\n return this._afterClosed.asObservable();\r\n }\r\n\r\n /** Observable that emits when the backdrop is clicked */\r\n get backdropClick(): Observable<MouseEvent> {\r\n return this._overlayRef.backdropClick;\r\n }\r\n\r\n /** Observable that emits when a keydown event occurs on the overlay */\r\n get keydownEvents(): Observable<KeyboardEvent> {\r\n return this._overlayRef.keydownEvents;\r\n }\r\n\r\n /**\r\n * Closes the dialog with an optional result\r\n */\r\n close(dialogResult?: R): void {\r\n if (this._state === 'exit') {\r\n return;\r\n }\r\n\r\n this._result = dialogResult;\r\n this._state = 'exit';\r\n\r\n // Emit before closed event\r\n this._beforeClosed.next(dialogResult);\r\n this._beforeClosed.complete();\r\n\r\n // Get animation duration from config\r\n const exitDuration = this._parseAnimationDuration(this._config.exitAnimationDuration);\r\n\r\n if (exitDuration > 0) {\r\n // Add exit animation class\r\n this._overlayRef.addPanelClass('fui-dialog-exit');\r\n\r\n // Wait for animation then dispose\r\n setTimeout(() => {\r\n this._finishDialogClose();\r\n }, exitDuration);\r\n } else {\r\n this._finishDialogClose();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the dialog's position\r\n */\r\n updatePosition(position?: FuiDialogPosition): void {\r\n const strategy = this._overlayRef.getConfig().positionStrategy as FuiGlobalPositionStrategy;\r\n\r\n if (strategy) {\r\n if (position?.left || position?.right) {\r\n if (position?.left) {\r\n strategy.left(position.left);\r\n } else if (position?.right) {\r\n strategy.right(position.right);\r\n }\r\n } else {\r\n strategy.centerHorizontally();\r\n }\r\n\r\n if (position?.top || position?.bottom) {\r\n if (position?.top) {\r\n strategy.top(position.top);\r\n } else if (position?.bottom) {\r\n strategy.bottom(position.bottom);\r\n }\r\n } else {\r\n strategy.centerVertically();\r\n }\r\n\r\n this._overlayRef.updatePosition();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the dialog's dimensions\r\n */\r\n updateSize(width?: string, height?: string): void {\r\n this._overlayRef.updateSize({\r\n width: width ?? undefined,\r\n height: height ?? undefined,\r\n });\r\n }\r\n\r\n /**\r\n * Adds CSS classes to the dialog panel\r\n */\r\n addPanelClass(classes: string | string[]): void {\r\n this._overlayRef.addPanelClass(classes);\r\n }\r\n\r\n /**\r\n * Removes CSS classes from the dialog panel\r\n */\r\n removePanelClass(classes: string | string[]): void {\r\n this._overlayRef.removePanelClass(classes);\r\n }\r\n\r\n /**\r\n * Gets the current state of the dialog's lifecycle\r\n */\r\n getState(): FuiDialogState {\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Notifies that the dialog has been opened (internal use)\r\n */\r\n _notifyOpened(): void {\r\n this._afterOpened.next();\r\n this._afterOpened.complete();\r\n }\r\n\r\n private _setupEventHandlers(): void {\r\n // Handle backdrop clicks\r\n this._overlayRef.backdropClick.subscribe(() => {\r\n if (!this.disableClose) {\r\n this.close();\r\n }\r\n });\r\n\r\n // Handle escape key\r\n this._overlayRef.keydownEvents\r\n .pipe(filter((event) => event.key === 'Escape' && !this.disableClose))\r\n .subscribe((event) => {\r\n event.preventDefault();\r\n this.close();\r\n });\r\n }\r\n\r\n private _finishDialogClose(): void {\r\n // Dispose the overlay\r\n this._overlayRef.dispose();\r\n\r\n // Emit after closed event\r\n this._afterClosed.next(this._result);\r\n this._afterClosed.complete();\r\n }\r\n\r\n private _parseAnimationDuration(duration: string | number | undefined): number {\r\n if (duration === undefined) {\r\n return 200; // Default 200ms\r\n }\r\n\r\n if (typeof duration === 'number') {\r\n return duration;\r\n }\r\n\r\n // Parse CSS duration string (e.g., '200ms', '0.2s')\r\n const match = /^(\\d+(?:\\.\\d+)?)(ms|s)$/.exec(duration);\r\n if (match) {\r\n const value = parseFloat(match[1]);\r\n const unit = match[2];\r\n return unit === 's' ? value * 1000 : value;\r\n }\r\n\r\n return 200;\r\n }\r\n\r\n private _generateId(): string {\r\n return `fui-dialog-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit,\r\n OnDestroy,\r\n inject,\r\n ChangeDetectionStrategy,\r\n signal,\r\n computed,\r\n HostListener,\r\n} from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { FuiDialogConfig, FuiDialogContainerBase } from './dialog.types';\r\n\r\n/**\r\n * # FuiDialogContainerComponent\r\n *\r\n * Internal container component that hosts the dialog content. This component\r\n * handles focus trapping, animations, and accessibility attributes.\r\n *\r\n * ## Features\r\n * - Focus trapping within the dialog\r\n * - Configurable ARIA attributes\r\n * - Enter/exit animations\r\n * - Focus restoration on close\r\n */\r\n@Component({\r\n selector: 'fui-dialog-container',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <div\r\n #dialogContainer\r\n class=\"fui-dialog-container\"\r\n [class.fui-dialog-enter]=\"animationState() === 'enter'\"\r\n [class.fui-dialog-exit]=\"animationState() === 'exit'\"\r\n [attr.role]=\"config.role || 'dialog'\"\r\n [attr.aria-modal]=\"true\"\r\n [attr.aria-label]=\"config.ariaLabel\"\r\n [attr.aria-labelledby]=\"config.ariaLabelledBy\"\r\n [attr.aria-describedby]=\"config.ariaDescribedBy\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"fui-dialog-content\" aria-live=\"polite\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n outline: 0;\r\n }\r\n\r\n .fui-dialog-container {\r\n display: flex;\r\n flex-direction: column;\r\n box-sizing: border-box;\r\n overflow: auto;\r\n outline: 0;\r\n max-height: inherit;\r\n border: 1px solid var(--fui-border-color);\r\n border-radius: var(--fui-border-radius-md);\r\n background: var(--fui-surface-00);\r\n box-shadow: var(--fui-dialog-box-shadow, var(--fui-shadow-05));\r\n }\r\n\r\n .fui-dialog-content {\r\n display: contents;\r\n }\r\n\r\n .fui-dialog-enter {\r\n animation: fui-dialog-enter var(--fui-duration-moderate-02) var(--fui-ease-entrance);\r\n }\r\n\r\n .fui-dialog-exit {\r\n animation: fui-dialog-exit var(--fui-duration-moderate-01) var(--fui-ease-exit);\r\n }\r\n\r\n @keyframes fui-dialog-enter {\r\n from {\r\n opacity: 0;\r\n transform: scale(0.95);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n }\r\n\r\n @keyframes fui-dialog-exit {\r\n from {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: scale(0.95);\r\n }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .fui-dialog-enter,\r\n .fui-dialog-exit {\r\n animation: none;\r\n }\r\n }\r\n `,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'fui-dialog-container-host',\r\n },\r\n})\r\nexport class FuiDialogContainerComponent implements FuiDialogContainerBase, AfterViewInit, OnDestroy {\r\n private readonly _document = inject(DOCUMENT);\r\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n @ViewChild('dialogContainer', { static: true })\r\n private _dialogContainer!: ElementRef<HTMLElement>;\r\n\r\n /** Configuration for the dialog */\r\n config!: FuiDialogConfig;\r\n\r\n /** The previously focused element before the dialog was opened */\r\n private _elementFocusedBeforeDialogWasOpened: HTMLElement | null = null;\r\n\r\n /** Animation state of the dialog */\r\n readonly animationState = signal<'void' | 'enter' | 'exit'>('void');\r\n\r\n /** Whether the dialog is currently animating */\r\n readonly isAnimating = computed(() => this.animationState() !== 'void');\r\n\r\n ngAfterViewInit(): void {\r\n this._trapFocus();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._restoreFocus();\r\n }\r\n\r\n /**\r\n * Handles keydown events for focus trap cycling within the dialog.\r\n * Tab loops from last to first focusable element, Shift+Tab from first to last.\r\n */\r\n @HostListener('keydown', ['$event'])\r\n _onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Tab') {\r\n const focusableElements = this._getFocusableElements();\r\n if (focusableElements.length === 0) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const firstFocusable = focusableElements[0];\r\n const lastFocusable = focusableElements[focusableElements.length - 1];\r\n const activeElement = this._document.activeElement;\r\n\r\n if (event.shiftKey) {\r\n // Shift+Tab: if on first element, wrap to last\r\n if (activeElement === firstFocusable || activeElement === this._dialogContainer.nativeElement) {\r\n event.preventDefault();\r\n lastFocusable.focus();\r\n }\r\n } else {\r\n // Tab: if on last element, wrap to first\r\n if (activeElement === lastFocusable) {\r\n event.preventDefault();\r\n firstFocusable.focus();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the dialog container with the given configuration\r\n */\r\n _initializeWithConfig(config: FuiDialogConfig): void {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Starts the enter animation\r\n */\r\n _startEnterAnimation(): void {\r\n this.animationState.set('enter');\r\n }\r\n\r\n /**\r\n * Starts the exit animation\r\n */\r\n _startExitAnimation(): void {\r\n this.animationState.set('exit');\r\n }\r\n\r\n /**\r\n * Gets the native element of the container\r\n */\r\n _getHostElement(): HTMLElement {\r\n return this._elementRef.nativeElement;\r\n }\r\n\r\n /**\r\n * Saves the element that was focused before the dialog opened and traps focus\r\n */\r\n private _trapFocus(): void {\r\n // Store the currently focused element\r\n this._elementFocusedBeforeDialogWasOpened = this._document.activeElement as HTMLElement;\r\n\r\n // Focus the dialog container\r\n const autoFocus = this.config?.autoFocus ?? 'first-tabbable';\r\n\r\n if (autoFocus === false || autoFocus === 'dialog') {\r\n // Focus the dialog container itself\r\n this._dialogContainer.nativeElement.focus();\r\n } else if (autoFocus === 'first-tabbable') {\r\n this._focusFirstTabbableElement();\r\n } else if (autoFocus === 'first-heading') {\r\n this._focusFirstHeading();\r\n } else if (typeof autoFocus === 'string') {\r\n // Focus a specific element by selector\r\n this._focusBySelector(autoFocus);\r\n } else {\r\n // Default: focus first tabbable\r\n this._focusFirstTabbableElement();\r\n }\r\n }\r\n\r\n /**\r\n * Focuses the first tabbable element within the dialog\r\n */\r\n private _focusFirstTabbableElement(): void {\r\n const focusableElements = this._getFocusableElements();\r\n if (focusableElements.length > 0) {\r\n focusableElements[0].focus();\r\n } else {\r\n // Fallback to container\r\n this._dialogContainer.nativeElement.focus();\r\n }\r\n }\r\n\r\n /**\r\n * Focuses the first heading element within the dialog\r\n */\r\n private _focusFirstHeading(): void {\r\n const heading = this._dialogContainer.nativeElement.querySelector<HTMLElement>(\r\n 'h1, h2, h3, h4, h5, h6, [role=\"heading\"]',\r\n );\r\n\r\n if (heading) {\r\n // Make heading focusable if it's not already\r\n if (!heading.hasAttribute('tabindex')) {\r\n heading.setAttribute('tabindex', '-1');\r\n }\r\n heading.focus();\r\n } else {\r\n this._focusFirstTabbableElement();\r\n }\r\n }\r\n\r\n /**\r\n * Focuses an element matching the given selector\r\n */\r\n private _focusBySelector(selector: string): void {\r\n const element = this._dialogContainer.nativeElement.querySelector<HTMLElement>(selector);\r\n if (element) {\r\n element.focus();\r\n } else {\r\n this._focusFirstTabbableElement();\r\n }\r\n }\r\n\r\n /**\r\n * Gets all focusable elements within the dialog\r\n */\r\n private _getFocusableElements(): HTMLElement[] {\r\n const focusableSelectors = [\r\n 'a[href]',\r\n 'button:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'input:not([disabled])',\r\n 'select:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable=\"true\"]',\r\n ].join(',');\r\n\r\n return Array.from(this._dialogContainer.nativeElement.querySelectorAll<HTMLElement>(focusableSelectors)).filter(\r\n (el) => {\r\n // Filter out elements that are not visible\r\n return el.offsetParent !== null;\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Restores focus to the element that was focused before the dialog opened\r\n */\r\n private _restoreFocus(): void {\r\n const shouldRestoreFocus = this.config?.restoreFocus !== false;\r\n\r\n if (shouldRestoreFocus && this._elementFocusedBeforeDialogWasOpened) {\r\n // Check if the element is still in the DOM and can receive focus\r\n if (typeof this._elementFocusedBeforeDialogWasOpened.focus === 'function') {\r\n this._elementFocusedBeforeDialogWasOpened.focus();\r\n }\r\n }\r\n\r\n this._elementFocusedBeforeDialogWasOpened = null;\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject } from '@angular/core';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiButtonDirective } from '@raintonic/formaui/components/button';\r\nimport { FUI_DIALOG_DATA, FuiConfirmDialogConfig } from './dialog.types';\r\nimport { FuiDialogRef } from './dialog-ref';\r\n\r\n@Component({\r\n selector: 'fui-confirm-dialog',\r\n standalone: true,\r\n imports: [FuiIconComponent, FuiButtonDirective],\r\n templateUrl: './confirm-dialog.component.html',\r\n styleUrls: ['./confirm-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'fui-confirm-dialog' },\r\n})\r\nexport class FuiConfirmDialogComponent {\r\n private readonly data = inject(FUI_DIALOG_DATA) as FuiConfirmDialogConfig;\r\n private readonly dialogRef = inject(FuiDialogRef);\r\n\r\n readonly title = this.data.title;\r\n readonly message = this.data.message;\r\n readonly confirmText = this.data.confirmText ?? 'Confirm';\r\n readonly cancelText = this.data.cancelText ?? 'Cancel';\r\n readonly variant = this.data.variant ?? 'info';\r\n\r\n readonly icon = computed(() => {\r\n switch (this.variant) {\r\n case 'warning':\r\n return 'warning-diamond';\r\n case 'danger':\r\n return 'warning-octagon';\r\n default:\r\n return 'info';\r\n }\r\n });\r\n\r\n readonly confirmButtonVariant = computed(() => {\r\n switch (this.variant) {\r\n case 'danger':\r\n return 'destructive';\r\n case 'warning':\r\n return 'primary';\r\n default:\r\n return 'primary';\r\n }\r\n });\r\n\r\n onConfirm(): void {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n}\r\n","<div class=\"fui-confirm-dialog__header\">\r\n <fui-icon class=\"fui-confirm-dialog__icon fui-confirm-dialog__icon--{{ variant }}\" [name]=\"icon()\" size=\"lg\" />\r\n <h2 class=\"fui-confirm-dialog__title\" id=\"confirm-dialog-title\">{{ title }}</h2>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__body\" id=\"confirm-dialog-description\">\r\n <p class=\"fui-confirm-dialog__message\">{{ message }}</p>\r\n</div>\r\n\r\n<div class=\"fui-confirm-dialog__actions\">\r\n <button fuiButton variant=\"tertiary\" (click)=\"onCancel()\">{{ cancelText }}</button>\r\n <button fuiButton [variant]=\"confirmButtonVariant()\" (click)=\"onConfirm()\">{{ confirmText }}</button>\r\n</div>\r\n","import {\r\n Injectable,\r\n Injector,\r\n ComponentRef,\r\n TemplateRef,\r\n Type,\r\n createComponent,\r\n EnvironmentInjector,\r\n inject,\r\n EmbeddedViewRef,\r\n StaticProvider,\r\n ApplicationRef,\r\n} from '@angular/core';\r\nimport { Observable, Subject, defer } from 'rxjs';\r\nimport { map, startWith } from 'rxjs/operators';\r\nimport { FuiOverlayService, FuiOverlayRef, FuiOverlayConfig } from '@raintonic/formaui/cdk/overlay';\r\nimport { FuiDialogConfig, IFuiDialogRef, FUI_DIALOG_DATA, FuiConfirmDialogConfig } from './dialog.types';\r\nimport { FuiDialogRef } from './dialog-ref';\r\nimport { FuiDialogContainerComponent } from './dialog-container.component';\r\nimport { FuiConfirmDialogComponent } from './confirm-dialog.component';\r\n\r\n/**\r\n * # FuiDialogService\r\n *\r\n * Service for opening modal dialogs. This service provides a comprehensive\r\n * dialog system similar to Angular Material's MatDialog, built on top of\r\n * the FuiOverlayService.\r\n *\r\n * ## Features\r\n * - Open dialogs with components or templates\r\n * - Pass data to dialog components\r\n * - Configure positioning, sizing, and behavior\r\n * - Get results from dialogs via observables\r\n * - Manage multiple open dialogs\r\n * - Automatic focus management and accessibility\r\n *\r\n * ## Usage\r\n *\r\n * ### Opening a Component Dialog\r\n * ```typescript\r\n * const dialogRef = this.dialog.open(MyDialogComponent, {\r\n * width: '400px',\r\n * data: { name: 'John' }\r\n * });\r\n *\r\n * dialogRef.afterClosed().subscribe(result => {\r\n * console.log('Dialog result:', result);\r\n * });\r\n * ```\r\n *\r\n * ### Opening a Template Dialog\r\n * ```typescript\r\n * const dialogRef = this.dialog.open(myTemplateRef, {\r\n * width: '300px',\r\n * hasBackdrop: true\r\n * });\r\n * ```\r\n *\r\n * ### Accessing Data in Dialog Component\r\n * ```typescript\r\n * export class MyDialogComponent {\r\n * private readonly data = inject(FUI_DIALOG_DATA);\r\n * private readonly dialogRef = inject(FuiDialogRef);\r\n *\r\n * onClose() {\r\n * this.dialogRef.close('result');\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FuiDialogService {\r\n private readonly _overlayService = inject(FuiOverlayService);\r\n private readonly _environmentInjector = inject(EnvironmentInjector);\r\n private readonly _injector = inject(Injector);\r\n private readonly _appRef = inject(ApplicationRef);\r\n\r\n private readonly _openDialogs: IFuiDialogRef[] = [];\r\n private readonly _afterOpenedSubject = new Subject<IFuiDialogRef>();\r\n private readonly _afterAllClosedSubject = new Subject<void>();\r\n\r\n private _nextUniqueId = 0;\r\n\r\n /**\r\n * Observable that emits when a dialog is opened\r\n */\r\n readonly afterOpened: Observable<IFuiDialogRef> = this._afterOpenedSubject.asObservable();\r\n\r\n /**\r\n * Observable that emits when all dialogs are closed\r\n */\r\n readonly afterAllClosed: Observable<void> = defer(() =>\r\n this._openDialogs.length ? this._getAfterAllClosed() : this._getAfterAllClosed().pipe(startWith(undefined)),\r\n );\r\n\r\n /**\r\n * Gets all currently open dialogs\r\n */\r\n get openDialogs(): IFuiDialogRef[] {\r\n return this._openDialogs.slice();\r\n }\r\n\r\n /**\r\n * Opens a dialog containing the given component or template\r\n * @param componentOrTemplateRef Component type or TemplateRef to display\r\n * @param config Configuration options for the dialog\r\n * @returns Reference to the opened dialog\r\n */\r\n open<T, D = unknown, R = unknown>(\r\n componentOrTemplateRef: Type<T> | TemplateRef<T>,\r\n config?: FuiDialogConfig<D>,\r\n ): FuiDialogRef<T, R> {\r\n const mergedConfig = this._applyConfigDefaults(config);\r\n const overlayRef = this._createOverlay(mergedConfig);\r\n const dialogContainer = this._attachDialogContainer(overlayRef, mergedConfig);\r\n const dialogRef = this._createDialogRef<T, R>(overlayRef, dialogContainer, mergedConfig);\r\n\r\n if (componentOrTemplateRef instanceof TemplateRef) {\r\n this._attachTemplateContent(dialogContainer, componentOrTemplateRef, dialogRef);\r\n } else {\r\n const componentRef = this._attachComponentContent<T, R>(\r\n dialogContainer,\r\n componentOrTemplateRef,\r\n dialogRef,\r\n mergedConfig,\r\n );\r\n dialogRef.componentInstance = componentRef.instance;\r\n }\r\n\r\n // Track open dialogs\r\n this._openDialogs.push(dialogRef);\r\n\r\n // Handle dialog close\r\n dialogRef.afterClosed.subscribe(() => {\r\n this._removeOpenDialog(dialogRef);\r\n });\r\n\r\n // Start enter animation and notify opened\r\n dialogContainer._startEnterAnimation();\r\n\r\n // Notify that dialog has been opened\r\n requestAnimationFrame(() => {\r\n dialogRef._notifyOpened();\r\n this._afterOpenedSubject.next(dialogRef);\r\n });\r\n\r\n return dialogRef;\r\n }\r\n\r\n /**\r\n * Closes all open dialogs\r\n */\r\n closeAll(): void {\r\n const dialogs = this._openDialogs.slice();\r\n dialogs.forEach((dialog) => {\r\n dialog.close();\r\n });\r\n }\r\n\r\n /**\r\n * Gets a dialog by its ID\r\n * @param id Dialog ID\r\n * @returns The dialog reference or undefined\r\n */\r\n getDialogById(id: string): IFuiDialogRef | undefined {\r\n return this._openDialogs.find((dialog) => dialog.id === id);\r\n }\r\n\r\n private _createOverlay(config: FuiDialogConfig): FuiOverlayRef {\r\n const overlayConfig = this._getOverlayConfig(config);\r\n return this._overlayService.create(overlayConfig);\r\n }\r\n\r\n private _getOverlayConfig(config: FuiDialogConfig): FuiOverlayConfig {\r\n // Create position strategy\r\n const positionStrategy = this._overlayService.position().global();\r\n\r\n // Apply positioning\r\n if (config.position?.left || config.position?.right) {\r\n if (config.position.left) {\r\n positionStrategy.left(config.position.left);\r\n } else if (config.position.right) {\r\n positionStrategy.right(config.position.right);\r\n }\r\n } else {\r\n positionStrategy.centerHorizontally();\r\n }\r\n\r\n if (config.position?.top || config.position?.bottom) {\r\n if (config.position.top) {\r\n positionStrategy.top(config.position.top);\r\n } else if (config.position.bottom) {\r\n positionStrategy.bottom(config.position.bottom);\r\n }\r\n } else {\r\n positionStrategy.centerVertically();\r\n }\r\n\r\n return {\r\n positionStrategy,\r\n scrollStrategy: this._overlayService.scrollStrategies.block(),\r\n hasBackdrop: config.hasBackdrop ?? true,\r\n backdropClass: this._getBackdropClass(config),\r\n backdropClickBehavior: config.disableClose ? 'ignore' : 'close',\r\n panelClass: this._getPanelClass(config),\r\n width: config.width,\r\n height: config.height,\r\n minWidth: config.minWidth,\r\n minHeight: config.minHeight,\r\n maxWidth: config.maxWidth,\r\n maxHeight: config.maxHeight,\r\n direction: config.direction,\r\n };\r\n }\r\n\r\n private _getBackdropClass(config: FuiDialogConfig): string[] {\r\n const baseClass = 'fui-dialog-backdrop';\r\n let customClasses: string[] = [];\r\n if (config.backdropClass) {\r\n customClasses = Array.isArray(config.backdropClass) ? config.backdropClass : [config.backdropClass];\r\n }\r\n\r\n return [baseClass, ...customClasses];\r\n }\r\n\r\n private _getPanelClass(config: FuiDialogConfig): string[] {\r\n const baseClass = 'fui-dialog-panel';\r\n let customPanelClasses: string[] = [];\r\n if (config.panelClass) {\r\n customPanelClasses = Array.isArray(config.panelClass) ? config.panelClass : [config.panelClass];\r\n }\r\n\r\n return [baseClass, ...customPanelClasses];\r\n }\r\n\r\n private _attachDialogContainer(overlayRef: FuiOverlayRef, config: FuiDialogConfig): FuiDialogContainerComponent {\r\n const containerRef = createComponent(FuiDialogContainerComponent, {\r\n environmentInjector: this._environmentInjector,\r\n });\r\n\r\n // Initialize the container with config\r\n containerRef.instance._initializeWithConfig(config);\r\n\r\n // Trigger change detection\r\n containerRef.changeDetectorRef.detectChanges();\r\n\r\n // Attach to overlay\r\n overlayRef.attach(containerRef);\r\n\r\n return containerRef.instance;\r\n }\r\n\r\n private _createDialogRef<T, R>(\r\n overlayRef: FuiOverlayRef,\r\n container: FuiDialogContainerComponent,\r\n config: FuiDialogConfig,\r\n ): FuiDialogRef<T, R> {\r\n const dialogId = config.id ?? `fui-dialog-${this._nextUniqueId++}`;\r\n return new FuiDialogRef<T, R>(overlayRef, config, dialogId);\r\n }\r\n\r\n private _attachComponentContent<T, R>(\r\n container: FuiDialogContainerComponent,\r\n component: Type<T>,\r\n dialogRef: FuiDialogRef<T, R>,\r\n config: FuiDialogConfig,\r\n ): ComponentRef<T> {\r\n // Create custom injector with dialog data and ref\r\n const providers: StaticProvider[] = [\r\n { provide: FUI_DIALOG_DATA, useValue: config.data },\r\n { provide: FuiDialogRef, useValue: dialogRef },\r\n ];\r\n\r\n const injector = Injector.create({\r\n parent: config.injector ?? this._injector,\r\n providers,\r\n });\r\n\r\n // Create the component\r\n const componentRef = createComponent(component, {\r\n environmentInjector: this._environmentInjector,\r\n elementInjector: injector,\r\n });\r\n\r\n // Attach to ApplicationRef to connect it to Angular's change detection tree\r\n // This is crucial for form controls and event bindings to work properly\r\n this._appRef.attachView(componentRef.hostView);\r\n\r\n // Append to container\r\n const hostElement = container._getHostElement();\r\n const containerElement = hostElement.querySelector('.fui-dialog-container');\r\n if (containerElement) {\r\n containerElement.appendChild(componentRef.location.nativeElement);\r\n }\r\n\r\n // Trigger change detection\r\n componentRef.changeDetectorRef.detectChanges();\r\n\r\n return componentRef;\r\n }\r\n\r\n private _attachTemplateContent<T, R>(\r\n container: FuiDialogContainerComponent,\r\n template: TemplateRef<T>,\r\n dialogRef: FuiDialogRef<T, R>,\r\n ): EmbeddedViewRef<T> {\r\n // Create the embedded view\r\n const context = { $implicit: dialogRef } as Record<string, unknown>;\r\n const viewRef = template.createEmbeddedView(context as T);\r\n\r\n // Attach to ApplicationRef to connect it to Angular's change detection tree\r\n this._appRef.attachView(viewRef);\r\n\r\n // Append to container\r\n const hostElement = container._getHostElement();\r\n const containerElement = hostElement.querySelector('.fui-dialog-container');\r\n if (containerElement) {\r\n viewRef.rootNodes.forEach((node) => {\r\n containerElement.appendChild(node);\r\n });\r\n }\r\n\r\n // Mark for check\r\n viewRef.detectChanges();\r\n\r\n return viewRef;\r\n }\r\n\r\n private _removeOpenDialog(dialogRef: IFuiDialogRef): void {\r\n const index = this._openDialogs.indexOf(dialogRef);\r\n if (index > -1) {\r\n this._openDialogs.splice(index, 1);\r\n\r\n // Emit if all dialogs are closed\r\n if (this._openDialogs.length === 0) {\r\n this._afterAllClosedSubject.next();\r\n }\r\n }\r\n }\r\n\r\n private _getAfterAllClosed(): Observable<void> {\r\n return this._afterAllClosedSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Opens a confirmation dialog and returns an Observable<boolean>.\r\n * Resolves to `true` when confirmed, `false` when cancelled, ESC, or backdrop click.\r\n */\r\n confirm(config: FuiConfirmDialogConfig): Observable<boolean> {\r\n const dialogRef = this.open(FuiConfirmDialogComponent, {\r\n width: '28rem',\r\n maxWidth: '90vw',\r\n data: config,\r\n role: config.variant === 'danger' ? 'alertdialog' : 'dialog',\r\n ariaLabelledBy: 'confirm-dialog-title',\r\n ariaDescribedBy: 'confirm-dialog-description',\r\n disableClose: false,\r\n });\r\n\r\n return dialogRef.afterClosed.pipe(map((result) => result === true));\r\n }\r\n\r\n private _applyConfigDefaults(config?: FuiDialogConfig): FuiDialogConfig {\r\n return {\r\n role: 'dialog',\r\n hasBackdrop: true,\r\n disableClose: false,\r\n maxWidth: '80vw',\r\n autoFocus: 'first-tabbable',\r\n restoreFocus: true,\r\n closeOnNavigation: true,\r\n enterAnimationDuration: 200,\r\n exitAnimationDuration: 150,\r\n ...config,\r\n };\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -152,7 +152,7 @@ class FuiNotificationContainerComponent {
152
152
  notification._dismiss();
153
153
  }
154
154
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiNotificationContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
155
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiNotificationContainerComponent, isStandalone: true, selector: "fui-notification-container", host: { attributes: { "role": "log", "aria-live": "polite", "aria-atomic": "false" }, classAttribute: "fui-notification-container" }, ngImport: i0, template: "<div class=\"fui-notification-container__stack\">\n @for (notification of notifications(); track notification.id) {\n <div class=\"fui-notification-container__item\" role=\"alert\" aria-atomic=\"true\">\n <fui-alert\n [variant]=\"notification.config.variant\"\n [title]=\"notification.config.title\"\n [description]=\"notification.config.description ?? null\"\n [closeable]=\"notification.config.closeable ?? true\"\n [icon]=\"notification.config.icon ?? null\"\n [progress]=\"shouldShowProgress(notification) ? getProgress(notification.id) : -1\"\n (closed)=\"onNotificationClose(notification)\"\n />\n </div>\n }\n</div>\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-notification-container{--fui-notification-bg: transparent;--fui-notification-radius: var(--fui-border-radius-md);--fui-notification-shadow: var(--fui-shadow-03);--fui-notification-shadow-hover: var(--fui-shadow-lg);--fui-notification-z-index: 9999;--fui-notification-padding: var(--fui-spacing-05);--fui-notification-gap: var(--fui-spacing-04);--fui-notification-min-width: 320px;--fui-notification-max-width: 500px;position:fixed;pointer-events:none;z-index:var(--fui-notification-z-index);display:flex;flex-direction:column;padding:var(--fui-notification-padding);gap:var(--fui-notification-gap)}.fui-notification-container__stack{display:flex;flex-direction:column;gap:var(--fui-spacing-04)}.fui-notification-container__item{pointer-events:auto;min-width:var(--fui-notification-min-width);max-width:var(--fui-notification-max-width);background-color:var(--fui-notification-bg);border-radius:var(--fui-notification-radius);box-shadow:var(--fui-notification-shadow);animation:slideIn .3s ease-out;transition:all var(--fui-duration-moderate-01) var(--fui-ease-standard) 0ms}.fui-notification-container__item:hover{transform:translateY(-2px);box-shadow:var(--fui-notification-shadow-hover)}.fui-notification-container__progress{margin-top:calc(-1 * var(--fui-spacing-04));padding:0 var(--fui-spacing-05) var(--fui-spacing-03)}@media(prefers-reduced-motion:reduce){.fui-notification-container .fui-notification-container__item{animation:none;transition:none}.fui-notification-container .fui-notification-container__item:hover{transform:none}}@keyframes slideIn{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}.fui-notification-container--top-left{top:0;left:0;align-items:flex-start}.fui-notification-container--top-center{top:0;left:50%;transform:translate(-50%);align-items:center}.fui-notification-container--top-right{top:0;right:0;align-items:flex-end}.fui-notification-container--bottom-left{bottom:0;left:0;align-items:flex-start}.fui-notification-container--bottom-left .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-left .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}.fui-notification-container--bottom-center{bottom:0;left:50%;transform:translate(-50%);align-items:center}.fui-notification-container--bottom-center .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-center .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}.fui-notification-container--bottom-right{bottom:0;right:0;align-items:flex-end}.fui-notification-container--bottom-right .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-right .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "component", type: FuiAlertComponent, selector: "fui-alert", inputs: ["variant", "title", "progress", "description", "closeable", "icon"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
155
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiNotificationContainerComponent, isStandalone: true, selector: "fui-notification-container", host: { attributes: { "role": "log", "aria-live": "polite", "aria-atomic": "false" }, classAttribute: "fui-notification-container" }, ngImport: i0, template: "<div class=\"fui-notification-container__stack\">\r\n @for (notification of notifications(); track notification.id) {\r\n <div class=\"fui-notification-container__item\" role=\"alert\" aria-atomic=\"true\">\r\n <fui-alert\r\n [variant]=\"notification.config.variant\"\r\n [title]=\"notification.config.title\"\r\n [description]=\"notification.config.description ?? null\"\r\n [closeable]=\"notification.config.closeable ?? true\"\r\n [icon]=\"notification.config.icon ?? null\"\r\n [progress]=\"shouldShowProgress(notification) ? getProgress(notification.id) : -1\"\r\n (closed)=\"onNotificationClose(notification)\"\r\n />\r\n </div>\r\n }\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-notification-container{--fui-notification-bg: transparent;--fui-notification-radius: var(--fui-border-radius-md);--fui-notification-shadow: var(--fui-shadow-03);--fui-notification-shadow-hover: var(--fui-shadow-lg);--fui-notification-z-index: 9999;--fui-notification-padding: var(--fui-spacing-05);--fui-notification-gap: var(--fui-spacing-04);--fui-notification-min-width: 320px;--fui-notification-max-width: 500px;position:fixed;pointer-events:none;z-index:var(--fui-notification-z-index);display:flex;flex-direction:column;padding:var(--fui-notification-padding);gap:var(--fui-notification-gap)}.fui-notification-container__stack{display:flex;flex-direction:column;gap:var(--fui-spacing-04)}.fui-notification-container__item{pointer-events:auto;min-width:var(--fui-notification-min-width);max-width:var(--fui-notification-max-width);background-color:var(--fui-notification-bg);border-radius:var(--fui-notification-radius);box-shadow:var(--fui-notification-shadow);animation:slideIn .3s ease-out;transition:all var(--fui-duration-moderate-01) var(--fui-ease-standard) 0ms}.fui-notification-container__item:hover{transform:translateY(-2px);box-shadow:var(--fui-notification-shadow-hover)}.fui-notification-container__progress{margin-top:calc(-1 * var(--fui-spacing-04));padding:0 var(--fui-spacing-05) var(--fui-spacing-03)}@media(prefers-reduced-motion:reduce){.fui-notification-container .fui-notification-container__item{animation:none;transition:none}.fui-notification-container .fui-notification-container__item:hover{transform:none}}@keyframes slideIn{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}.fui-notification-container--top-left{top:0;left:0;align-items:flex-start}.fui-notification-container--top-center{top:0;left:50%;transform:translate(-50%);align-items:center}.fui-notification-container--top-right{top:0;right:0;align-items:flex-end}.fui-notification-container--bottom-left{bottom:0;left:0;align-items:flex-start}.fui-notification-container--bottom-left .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-left .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}.fui-notification-container--bottom-center{bottom:0;left:50%;transform:translate(-50%);align-items:center}.fui-notification-container--bottom-center .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-center .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}.fui-notification-container--bottom-right{bottom:0;right:0;align-items:flex-end}.fui-notification-container--bottom-right .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-right .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "component", type: FuiAlertComponent, selector: "fui-alert", inputs: ["variant", "title", "progress", "description", "closeable", "icon"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
156
156
  }
157
157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiNotificationContainerComponent, decorators: [{
158
158
  type: Component,
@@ -161,7 +161,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
161
161
  role: 'log',
162
162
  'aria-live': 'polite',
163
163
  'aria-atomic': 'false',
164
- }, template: "<div class=\"fui-notification-container__stack\">\n @for (notification of notifications(); track notification.id) {\n <div class=\"fui-notification-container__item\" role=\"alert\" aria-atomic=\"true\">\n <fui-alert\n [variant]=\"notification.config.variant\"\n [title]=\"notification.config.title\"\n [description]=\"notification.config.description ?? null\"\n [closeable]=\"notification.config.closeable ?? true\"\n [icon]=\"notification.config.icon ?? null\"\n [progress]=\"shouldShowProgress(notification) ? getProgress(notification.id) : -1\"\n (closed)=\"onNotificationClose(notification)\"\n />\n </div>\n }\n</div>\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-notification-container{--fui-notification-bg: transparent;--fui-notification-radius: var(--fui-border-radius-md);--fui-notification-shadow: var(--fui-shadow-03);--fui-notification-shadow-hover: var(--fui-shadow-lg);--fui-notification-z-index: 9999;--fui-notification-padding: var(--fui-spacing-05);--fui-notification-gap: var(--fui-spacing-04);--fui-notification-min-width: 320px;--fui-notification-max-width: 500px;position:fixed;pointer-events:none;z-index:var(--fui-notification-z-index);display:flex;flex-direction:column;padding:var(--fui-notification-padding);gap:var(--fui-notification-gap)}.fui-notification-container__stack{display:flex;flex-direction:column;gap:var(--fui-spacing-04)}.fui-notification-container__item{pointer-events:auto;min-width:var(--fui-notification-min-width);max-width:var(--fui-notification-max-width);background-color:var(--fui-notification-bg);border-radius:var(--fui-notification-radius);box-shadow:var(--fui-notification-shadow);animation:slideIn .3s ease-out;transition:all var(--fui-duration-moderate-01) var(--fui-ease-standard) 0ms}.fui-notification-container__item:hover{transform:translateY(-2px);box-shadow:var(--fui-notification-shadow-hover)}.fui-notification-container__progress{margin-top:calc(-1 * var(--fui-spacing-04));padding:0 var(--fui-spacing-05) var(--fui-spacing-03)}@media(prefers-reduced-motion:reduce){.fui-notification-container .fui-notification-container__item{animation:none;transition:none}.fui-notification-container .fui-notification-container__item:hover{transform:none}}@keyframes slideIn{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}.fui-notification-container--top-left{top:0;left:0;align-items:flex-start}.fui-notification-container--top-center{top:0;left:50%;transform:translate(-50%);align-items:center}.fui-notification-container--top-right{top:0;right:0;align-items:flex-end}.fui-notification-container--bottom-left{bottom:0;left:0;align-items:flex-start}.fui-notification-container--bottom-left .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-left .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}.fui-notification-container--bottom-center{bottom:0;left:50%;transform:translate(-50%);align-items:center}.fui-notification-container--bottom-center .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-center .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}.fui-notification-container--bottom-right{bottom:0;right:0;align-items:flex-end}.fui-notification-container--bottom-right .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-right .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}\n"] }]
164
+ }, template: "<div class=\"fui-notification-container__stack\">\r\n @for (notification of notifications(); track notification.id) {\r\n <div class=\"fui-notification-container__item\" role=\"alert\" aria-atomic=\"true\">\r\n <fui-alert\r\n [variant]=\"notification.config.variant\"\r\n [title]=\"notification.config.title\"\r\n [description]=\"notification.config.description ?? null\"\r\n [closeable]=\"notification.config.closeable ?? true\"\r\n [icon]=\"notification.config.icon ?? null\"\r\n [progress]=\"shouldShowProgress(notification) ? getProgress(notification.id) : -1\"\r\n (closed)=\"onNotificationClose(notification)\"\r\n />\r\n </div>\r\n }\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-notification-container{--fui-notification-bg: transparent;--fui-notification-radius: var(--fui-border-radius-md);--fui-notification-shadow: var(--fui-shadow-03);--fui-notification-shadow-hover: var(--fui-shadow-lg);--fui-notification-z-index: 9999;--fui-notification-padding: var(--fui-spacing-05);--fui-notification-gap: var(--fui-spacing-04);--fui-notification-min-width: 320px;--fui-notification-max-width: 500px;position:fixed;pointer-events:none;z-index:var(--fui-notification-z-index);display:flex;flex-direction:column;padding:var(--fui-notification-padding);gap:var(--fui-notification-gap)}.fui-notification-container__stack{display:flex;flex-direction:column;gap:var(--fui-spacing-04)}.fui-notification-container__item{pointer-events:auto;min-width:var(--fui-notification-min-width);max-width:var(--fui-notification-max-width);background-color:var(--fui-notification-bg);border-radius:var(--fui-notification-radius);box-shadow:var(--fui-notification-shadow);animation:slideIn .3s ease-out;transition:all var(--fui-duration-moderate-01) var(--fui-ease-standard) 0ms}.fui-notification-container__item:hover{transform:translateY(-2px);box-shadow:var(--fui-notification-shadow-hover)}.fui-notification-container__progress{margin-top:calc(-1 * var(--fui-spacing-04));padding:0 var(--fui-spacing-05) var(--fui-spacing-03)}@media(prefers-reduced-motion:reduce){.fui-notification-container .fui-notification-container__item{animation:none;transition:none}.fui-notification-container .fui-notification-container__item:hover{transform:none}}@keyframes slideIn{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}.fui-notification-container--top-left{top:0;left:0;align-items:flex-start}.fui-notification-container--top-center{top:0;left:50%;transform:translate(-50%);align-items:center}.fui-notification-container--top-right{top:0;right:0;align-items:flex-end}.fui-notification-container--bottom-left{bottom:0;left:0;align-items:flex-start}.fui-notification-container--bottom-left .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-left .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}.fui-notification-container--bottom-center{bottom:0;left:50%;transform:translate(-50%);align-items:center}.fui-notification-container--bottom-center .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-center .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}.fui-notification-container--bottom-right{bottom:0;right:0;align-items:flex-end}.fui-notification-container--bottom-right .fui-notification-container__stack{flex-direction:column-reverse}.fui-notification-container--bottom-right .fui-notification-container__item{animation:slideInFromBottom .3s ease-out}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}\n"] }]
165
165
  }], ctorParameters: () => [] });
166
166
 
167
167
  /**