@sdcorejs/angular 19.1.3 → 19.1.5

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 (298) hide show
  1. package/README.md +19 -14
  2. package/components/audit-diff/index.d.ts +2 -0
  3. package/components/audit-diff/src/audit-diff.component.d.ts +30 -0
  4. package/components/audit-diff/src/audit-diff.engine.d.ts +40 -0
  5. package/components/badge/src/badge.component.d.ts +1 -1
  6. package/components/breadcrumb/index.d.ts +1 -0
  7. package/components/breadcrumb/src/breadcrumb.component.d.ts +50 -0
  8. package/components/data-state/index.d.ts +1 -0
  9. package/components/data-state/src/data-state.component.d.ts +40 -0
  10. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +1 -2
  11. package/components/document-builder/src/document-builder.component.d.ts +4 -4
  12. package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +7 -8
  13. package/components/form-generic/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +4 -5
  14. package/components/form-generic/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +1 -2
  15. package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +6 -5
  16. package/components/form-generic/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +4 -5
  17. package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +9 -9
  18. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +8 -7
  19. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +8 -7
  20. package/components/form-generic/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +3 -4
  21. package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +5 -6
  22. package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +1 -2
  23. package/components/form-generic/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +4 -5
  24. package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +6 -6
  25. package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +6 -6
  26. package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +3 -3
  27. package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +6 -6
  28. package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +3 -3
  29. package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +2 -2
  30. package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +6 -6
  31. package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +3 -3
  32. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +6 -5
  33. package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +7 -6
  34. package/components/form-generic/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +7 -8
  35. package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +3 -4
  36. package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +6 -6
  37. package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +3 -3
  38. package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +6 -6
  39. package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +3 -3
  40. package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +6 -6
  41. package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +3 -3
  42. package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +6 -6
  43. package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +3 -3
  44. package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +6 -6
  45. package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +3 -3
  46. package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +6 -6
  47. package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +3 -3
  48. package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +6 -6
  49. package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +3 -3
  50. package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +7 -6
  51. package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +7 -6
  52. package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +7 -7
  53. package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +6 -6
  54. package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +7 -6
  55. package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +6 -7
  56. package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +6 -7
  57. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +8 -8
  58. package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +7 -6
  59. package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +7 -6
  60. package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +7 -6
  61. package/components/form-generic/src/components/form-render/components/item/item.component.d.ts +4 -4
  62. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +8 -9
  63. package/components/form-generic/src/pipes/component-viewed.pipe.d.ts +2 -3
  64. package/components/form-generic/src/pipes/html.pipe.d.ts +2 -2
  65. package/components/form-generic/src/services/form-render.service.d.ts +2 -2
  66. package/components/import-excel/src/import-excel.component.d.ts +4 -7
  67. package/components/import-excel/src/pipes/column-transform.pipe.d.ts +3 -2
  68. package/components/index.d.ts +4 -0
  69. package/components/job-progress/index.d.ts +1 -0
  70. package/components/job-progress/src/job-progress.component.d.ts +34 -0
  71. package/components/mini-editor/src/mini-editor.component.d.ts +7 -7
  72. package/components/modal/src/modal.component.d.ts +6 -1
  73. package/components/preview/index.d.ts +3 -0
  74. package/components/preview/src/preview-pdf/preview-pdf.browser.d.ts +28 -0
  75. package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +61 -23
  76. package/components/preview/src/preview-pdf/preview-pdf.pdfjs.d.ts +77 -0
  77. package/components/preview/src/preview-pdf/preview-pdf.print.d.ts +10 -0
  78. package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +11 -9
  79. package/components/side-drawer/src/side-drawer.component.d.ts +6 -1
  80. package/components/tab/src/tab-group.component.d.ts +1 -0
  81. package/components/tab/src/tab.component.d.ts +7 -1
  82. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +3 -4
  83. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
  84. package/components/tab-router/src/services/tab-decorator.service.d.ts +2 -1
  85. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +1 -1
  86. package/components/table/src/components/popup-export/popup-export.component.d.ts +6 -6
  87. package/components/table/src/models/table-column.model.d.ts +1 -1
  88. package/components/table/src/services/config.service.d.ts +3 -2
  89. package/components/table/src/services/table-filter/table-filter.model.d.ts +1 -1
  90. package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
  91. package/components/tree/src/tree.component.d.ts +13 -2
  92. package/components/tree/src/tree.model.d.ts +11 -0
  93. package/components/upload-file/src/components/preview/preview.component.d.ts +4 -4
  94. package/directives/src/sd-hover-copy.directive.d.ts +6 -5
  95. package/directives/src/sd-href.directive.d.ts +2 -2
  96. package/directives/src/sd-scroll.directive.d.ts +3 -2
  97. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  98. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  99. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  100. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  101. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  102. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  103. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  104. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  105. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  106. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  107. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +16 -21
  108. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  109. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  110. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +463 -806
  112. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  113. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +23 -33
  114. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  116. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  117. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +9 -19
  118. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  119. package/fesm2022/sdcorejs-angular-components-modal.mjs +60 -3
  120. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  121. package/fesm2022/sdcorejs-angular-components-preview.mjs +1437 -217
  122. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  123. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +4 -4
  124. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  125. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  126. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +38 -1
  128. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +16 -22
  130. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  131. package/fesm2022/sdcorejs-angular-components-tab.mjs +47 -3
  132. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  133. package/fesm2022/sdcorejs-angular-components-table.mjs +94 -61
  134. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  135. package/fesm2022/sdcorejs-angular-components-tree.mjs +185 -16
  136. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  137. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +14 -21
  138. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  140. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  142. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +7 -7
  144. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -73
  146. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +6 -3
  148. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-forms-chip.mjs +6 -3
  150. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -13
  152. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-forms-date.mjs +42 -65
  154. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +51 -66
  156. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  158. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  159. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +1 -1
  160. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +7 -5
  162. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-forms-input.mjs +289 -55
  164. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  166. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -68
  168. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -20
  170. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -66
  172. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +6 -5
  174. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  175. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +279 -0
  176. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  177. package/fesm2022/sdcorejs-angular-forms-time.mjs +309 -0
  178. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  179. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  180. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  181. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  182. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-i18n.mjs +375 -10
  184. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  186. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-modules-layout.mjs +992 -166
  188. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  190. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  192. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  193. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  194. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  195. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  196. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  197. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  198. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  199. package/fesm2022/sdcorejs-angular-services-loading.mjs +339 -74
  200. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  201. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  202. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  203. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  204. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  205. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  206. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  207. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  208. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  209. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  210. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  211. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  212. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  213. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  214. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  215. package/forms/autocomplete/src/autocomplete.component.d.ts +3 -4
  216. package/forms/checkbox/src/checkbox.component.d.ts +4 -8
  217. package/forms/date/src/date.component.d.ts +3 -2
  218. package/forms/date-range/src/date-range.component.d.ts +5 -8
  219. package/forms/datetime/src/datetime.component.d.ts +3 -2
  220. package/forms/entity-picker/index.d.ts +1 -0
  221. package/forms/entity-picker/src/entity-picker.component.d.ts +123 -0
  222. package/forms/index.d.ts +6 -0
  223. package/forms/input/index.d.ts +1 -0
  224. package/forms/input/src/input-mask.d.ts +43 -0
  225. package/forms/input/src/input.component.d.ts +26 -9
  226. package/forms/input-number/src/input-number.component.d.ts +1 -1
  227. package/forms/models/index.d.ts +1 -0
  228. package/forms/models/src/sd-form-control-connector.d.ts +86 -0
  229. package/forms/radio/src/radio.component.d.ts +12 -8
  230. package/forms/src/forms.module.d.ts +9 -5
  231. package/forms/switch/src/switch.component.d.ts +4 -7
  232. package/forms/time/index.d.ts +3 -0
  233. package/forms/time/src/time-picker.adapter.d.ts +13 -0
  234. package/forms/time/src/time-value.d.ts +19 -0
  235. package/forms/time/src/time.component.d.ts +78 -0
  236. package/forms/time-range/index.d.ts +2 -0
  237. package/forms/time-range/src/time-range-value.d.ts +14 -0
  238. package/forms/time-range/src/time-range.component.d.ts +80 -0
  239. package/forms/tree-select/index.d.ts +1 -0
  240. package/forms/tree-select/src/tree-select.component.d.ts +71 -0
  241. package/i18n/src/en.d.ts +72 -2
  242. package/interceptors/no-internet/no-internet.interceptor.d.ts +2 -3
  243. package/interceptors/unauthorized/unauthorized.interceptor.d.ts +2 -2
  244. package/modules/layout/components/index.d.ts +6 -0
  245. package/modules/layout/components/layout-main/layout-main.component.d.ts +7 -2
  246. package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +33 -0
  247. package/modules/layout/components/shared/search-field/search-field.component.d.ts +9 -0
  248. package/modules/layout/components/shared/user-menu/user-menu.component.d.ts +45 -0
  249. package/modules/layout/components/sidebar-mobile-v1/components/user/user.component.d.ts +3 -11
  250. package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +27 -0
  251. package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +28 -0
  252. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +4 -4
  253. package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +3 -9
  254. package/modules/layout/components/sidebar-v1/main.component.d.ts +3 -2
  255. package/modules/layout/components/sidebar-v2/main.component.d.ts +36 -0
  256. package/modules/layout/components/sidebar-v3/main.component.d.ts +29 -0
  257. package/modules/layout/configurations/layout.configuration.d.ts +78 -5
  258. package/modules/layout/index.d.ts +1 -0
  259. package/modules/layout/pipes/menu.pipe.d.ts +2 -2
  260. package/modules/layout/services/index.d.ts +3 -0
  261. package/modules/layout/services/layout.service.d.ts +2 -2
  262. package/modules/layout/services/menu/menu.utils.d.ts +6 -0
  263. package/modules/layout/services/navigation-state/navigation-state.service.d.ts +18 -0
  264. package/modules/layout/services/responsive/responsive.service.d.ts +12 -0
  265. package/modules/layout/services/storage/storage.service.d.ts +21 -8
  266. package/package.json +49 -1
  267. package/pipes/src/safe-html.pipe.d.ts +2 -2
  268. package/services/api/src/api.model.d.ts +54 -15
  269. package/services/api/src/api.service.d.ts +13 -8
  270. package/services/api/src/interceptors/api.interceptor.d.ts +1 -1
  271. package/services/cache/src/cache.model.d.ts +46 -13
  272. package/services/cache/src/cache.service.d.ts +5 -2
  273. package/services/confirm/src/lib/confirm.service.d.ts +2 -2
  274. package/services/docx/src/lib/docx.service.d.ts +2 -3
  275. package/services/index.d.ts +4 -0
  276. package/services/loading/src/loading.service.d.ts +15 -8
  277. package/services/notify/src/components/toast/toast.component.d.ts +2 -3
  278. package/services/persistence/index.d.ts +5 -0
  279. package/services/persistence/src/graph-serializer.d.ts +16 -0
  280. package/services/persistence/src/persistence-envelope.d.ts +28 -0
  281. package/services/persistence/src/persistence-key.d.ts +17 -0
  282. package/services/persistence/src/persistence.model.d.ts +63 -0
  283. package/services/persistence/src/storage-adapter.d.ts +29 -0
  284. package/services/storage/src/storage.model.d.ts +20 -5
  285. package/services/storage/src/storage.service.d.ts +6 -3
  286. package/services/task/index.d.ts +3 -0
  287. package/services/task/src/task.model.d.ts +75 -0
  288. package/services/task/src/task.service.d.ts +14 -0
  289. package/services/task/src/task.tokens.d.ts +12 -0
  290. package/services/unsaved-changes/index.d.ts +4 -0
  291. package/services/unsaved-changes/src/unsaved-changes.adapters.d.ts +15 -0
  292. package/services/unsaved-changes/src/unsaved-changes.model.d.ts +41 -0
  293. package/services/unsaved-changes/src/unsaved-changes.service.d.ts +16 -0
  294. package/services/unsaved-changes/src/unsaved-changes.tokens.d.ts +9 -0
  295. package/services/viewport/index.d.ts +3 -0
  296. package/services/viewport/src/viewport.model.d.ts +12 -0
  297. package/services/viewport/src/viewport.service.d.ts +18 -0
  298. package/services/viewport/src/viewport.tokens.d.ts +6 -0
@@ -1,97 +1,362 @@
1
+ import { DOCUMENT, isPlatformBrowser } from '@angular/common';
1
2
  import * as i0 from '@angular/core';
2
- import { Injectable } from '@angular/core';
3
+ import { inject, DestroyRef, PLATFORM_ID, RendererFactory2, Injectable } from '@angular/core';
3
4
 
5
+ var _a;
6
+ const SD_LOADING_STYLE_ATTRIBUTE = 'data-sd-loading-styles';
7
+ const SD_LOADING_STYLES = `
8
+ .sd-loading {
9
+ position: absolute;
10
+ inset: 0;
11
+ width: 100%;
12
+ height: 100%;
13
+ opacity: 0.6;
14
+ background: #fff;
15
+ z-index: 99999;
16
+ }
17
+
18
+ .sd-loading-spinner {
19
+ position: absolute;
20
+ top: calc(50% - 2.5rem);
21
+ left: calc(50% - 2.5rem);
22
+ width: 5rem;
23
+ height: 5rem;
24
+ border: 0.5rem solid var(--sd-primary);
25
+ border-top-color: var(--sd-border);
26
+ border-radius: 50%;
27
+ animation: sd-loading-spin 1s linear infinite;
28
+ }
29
+
30
+ @keyframes sd-loading-spin {
31
+ from { transform: rotate(0deg); }
32
+ to { transform: rotate(360deg); }
33
+ }
34
+ `;
35
+ const CLOSED_LOADING_REF = Object.freeze({
36
+ closed: true,
37
+ close() {
38
+ // A closed ref deliberately has no work to release.
39
+ },
40
+ });
4
41
  class SdLoadingService {
5
- loadingId = 'L8d556b9b-f6dd-46e9-9710-757e65d82839';
6
- renderer;
7
- loadingMap = new WeakMap();
8
- constructor(rendererFactory) {
9
- this.renderer = rendererFactory.createRenderer(null, null);
10
- }
11
- start = (element = 'body') => {
12
- // why: router tabs can leave multiple hosts with the same selector in the DOM;
13
- // querySelector would only overlay the first match.
14
- document.querySelectorAll(element).forEach(ele => {
15
- if (!this.loadingMap.has(ele)) {
16
- const loadingElement = this.#createLoading();
17
- ele.appendChild(loadingElement);
18
- this.loadingMap.set(ele, loadingElement);
19
- }
20
- });
42
+ static documentRecords = new WeakMap();
43
+ #document;
44
+ #renderer;
45
+ #isBrowser;
46
+ #destroyRef = inject(DestroyRef);
47
+ #handleQueue = [];
48
+ #styleRegistered = false;
49
+ #destroyed = false;
50
+ constructor() {
51
+ this.#document = inject(DOCUMENT);
52
+ this.#isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
53
+ const rendererFactory = inject(RendererFactory2);
54
+ this.#renderer = this.#isBrowser ? rendererFactory.createRenderer(null, null) : null;
55
+ this.#destroyRef.onDestroy(() => this.#destroy());
56
+ }
57
+ /** Starts loading for every current selector match and returns ownership of those exact hosts. */
58
+ start = (selector = 'body') => {
59
+ const renderer = this.#renderer;
60
+ if (this.#destroyed || !this.#isBrowser || !renderer)
61
+ return CLOSED_LOADING_REF;
62
+ const hosts = Array.from(this.#document.querySelectorAll(selector));
63
+ if (hosts.length === 0)
64
+ return CLOSED_LOADING_REF;
65
+ const documentRecord = this.#getOrCreateDocumentRecord();
66
+ this.#ensureStyles(documentRecord, renderer);
67
+ const state = { selector, contributions: [], closed: false };
68
+ for (const host of hosts) {
69
+ const contribution = {
70
+ host,
71
+ owner: state,
72
+ service: this,
73
+ released: false,
74
+ };
75
+ state.contributions.push(contribution);
76
+ this.#acquireHost(documentRecord, contribution, renderer);
77
+ }
78
+ this.#handleQueue.push(state);
79
+ return {
80
+ get closed() {
81
+ return state.closed;
82
+ },
83
+ close: () => this.#closeHandle(state, renderer),
84
+ };
21
85
  };
22
- isLoading = (element = 'body') => {
23
- const nodes = document.querySelectorAll(element);
24
- if (!nodes.length)
86
+ /** Returns the first matched globally loading host, `false` for idle matches, or `null` when unavailable. */
87
+ isLoading = (selector = 'body') => {
88
+ if (this.#destroyed || !this.#isBrowser)
25
89
  return null;
26
- for (const ele of Array.from(nodes)) {
27
- if (this.loadingMap.has(ele))
28
- return ele;
90
+ const hosts = this.#document.querySelectorAll(selector);
91
+ if (hosts.length === 0)
92
+ return null;
93
+ const documentRecord = _a.documentRecords.get(this.#document);
94
+ for (const host of Array.from(hosts)) {
95
+ const state = documentRecord?.hostStates.get(host);
96
+ if (state && state.count > 0 && state.overlay.parentNode === host)
97
+ return host;
29
98
  }
30
99
  return false;
31
100
  };
32
- stop = (element = 'body') => {
33
- document.querySelectorAll(element).forEach(ele => {
34
- if (this.loadingMap.has(ele)) {
35
- this.loadingMap.get(ele)?.remove();
36
- this.loadingMap.delete(ele);
37
- }
38
- });
101
+ /** Releases the oldest exact-selector start, with a current-host fallback for legacy cross-selector calls. */
102
+ stop = (selector = 'body') => {
103
+ const renderer = this.#renderer;
104
+ if (this.#destroyed || !this.#isBrowser || !renderer)
105
+ return;
106
+ const exactHandle = this.#handleQueue.find(state => !state.closed && state.selector === selector);
107
+ if (exactHandle) {
108
+ this.#closeHandle(exactHandle, renderer);
109
+ return;
110
+ }
111
+ const documentRecord = _a.documentRecords.get(this.#document);
112
+ if (!documentRecord)
113
+ return;
114
+ for (const host of Array.from(this.#document.querySelectorAll(selector))) {
115
+ const contribution = documentRecord.hostStates
116
+ .get(host)
117
+ ?.contributions.find(candidate => !candidate.released && candidate.service === this);
118
+ if (contribution)
119
+ this.#releaseContribution(documentRecord, contribution, renderer);
120
+ }
39
121
  };
40
- #createLoading = () => {
41
- const renderer = this.renderer;
42
- const container = this.renderer.createElement('div');
43
- const spinner = this.renderer.createElement('div');
44
- const containerStyle = {
45
- position: 'absolute',
46
- top: 0,
47
- left: 0,
48
- height: '100%',
49
- width: '100%',
50
- opacity: 0.6,
51
- background: '#FFFFFF',
52
- 'z-index': 99999,
53
- };
54
- const spinnerStyle = {
55
- position: 'absolute',
56
- top: 'calc(50% - 2.5rem)',
57
- left: 'calc(50% - 2.5rem)',
58
- width: '5rem',
59
- height: '5rem',
60
- border: '0.5rem solid var(--sd-primary)',
61
- 'border-top': '0.5rem solid var(--sd-border)',
62
- 'border-radius': '50%',
63
- animation: 'spin 1s linear infinite',
122
+ /** Runs a task inside a loading lifetime and always releases it without replacing the task result or error. */
123
+ async run(task, selector = 'body') {
124
+ const ref = this.start(selector);
125
+ try {
126
+ const result = typeof task === 'function' ? task() : task;
127
+ return await result;
128
+ }
129
+ finally {
130
+ ref.close();
131
+ }
132
+ }
133
+ #getOrCreateDocumentRecord() {
134
+ let record = _a.documentRecords.get(this.#document);
135
+ if (!record) {
136
+ record = {
137
+ hostStates: new WeakMap(),
138
+ liveHosts: new Set(),
139
+ style: undefined,
140
+ };
141
+ _a.documentRecords.set(this.#document, record);
142
+ }
143
+ return record;
144
+ }
145
+ #acquireHost(documentRecord, contribution, renderer) {
146
+ const host = contribution.host;
147
+ const existing = documentRecord.hostStates.get(host);
148
+ if (existing) {
149
+ this.#repairOverlay(host, existing, renderer);
150
+ existing.count += 1;
151
+ existing.contributions.push(contribution);
152
+ return;
153
+ }
154
+ const state = {
155
+ overlay: this.#createOverlay(renderer),
156
+ previousAriaBusy: host.getAttribute('aria-busy'),
157
+ contributions: [contribution],
158
+ count: 1,
64
159
  };
65
- const keyframes = `
66
- @keyframes spin {
67
- 0% { transform: rotate(0deg); }
68
- 100% { transform: rotate(360deg); }
69
- }
70
- `;
160
+ renderer.setAttribute(host, 'aria-busy', 'true');
161
+ renderer.appendChild(host, state.overlay);
162
+ documentRecord.hostStates.set(host, state);
163
+ documentRecord.liveHosts.add(host);
164
+ }
165
+ #repairOverlay(host, state, renderer) {
166
+ const currentParent = state.overlay.parentNode;
167
+ if (currentParent !== host) {
168
+ if (currentParent)
169
+ renderer.removeChild(currentParent, state.overlay);
170
+ renderer.appendChild(host, state.overlay);
171
+ }
172
+ if (host.getAttribute('aria-busy') !== 'true')
173
+ renderer.setAttribute(host, 'aria-busy', 'true');
174
+ }
175
+ #releaseContribution(documentRecord, contribution, renderer) {
176
+ if (contribution.released)
177
+ return;
178
+ contribution.released = true;
179
+ const state = documentRecord.hostStates.get(contribution.host);
180
+ if (state) {
181
+ const contributionIndex = state.contributions.indexOf(contribution);
182
+ if (contributionIndex >= 0)
183
+ state.contributions.splice(contributionIndex, 1);
184
+ state.count -= 1;
185
+ if (state.count <= 0)
186
+ this.#removeHost(documentRecord, contribution.host, state, renderer);
187
+ }
188
+ contribution.service.#closeOwnerWhenReleased(contribution.owner);
189
+ }
190
+ #removeHost(documentRecord, host, state, renderer) {
191
+ const parent = state.overlay.parentNode;
192
+ if (parent)
193
+ renderer.removeChild(parent, state.overlay);
194
+ if (host.getAttribute('aria-busy') === 'true') {
195
+ if (state.previousAriaBusy === null)
196
+ renderer.removeAttribute(host, 'aria-busy');
197
+ else
198
+ renderer.setAttribute(host, 'aria-busy', state.previousAriaBusy);
199
+ }
200
+ documentRecord.hostStates.delete(host);
201
+ documentRecord.liveHosts.delete(host);
202
+ this.#deleteDocumentRecordWhenEmpty(documentRecord);
203
+ }
204
+ #closeHandle(state, renderer) {
205
+ if (state.closed)
206
+ return;
207
+ state.closed = true;
208
+ this.#dequeueHandle(state);
209
+ const documentRecord = _a.documentRecords.get(this.#document);
210
+ if (documentRecord) {
211
+ for (const contribution of [...state.contributions]) {
212
+ this.#releaseContribution(documentRecord, contribution, renderer);
213
+ }
214
+ }
215
+ else {
216
+ for (const contribution of state.contributions)
217
+ contribution.released = true;
218
+ }
219
+ state.contributions.length = 0;
220
+ }
221
+ #closeOwnerWhenReleased(state) {
222
+ if (state.closed || state.contributions.some(contribution => !contribution.released))
223
+ return;
224
+ state.closed = true;
225
+ this.#dequeueHandle(state);
226
+ state.contributions.length = 0;
227
+ }
228
+ #dequeueHandle(state) {
229
+ const handleIndex = this.#handleQueue.indexOf(state);
230
+ if (handleIndex >= 0)
231
+ this.#handleQueue.splice(handleIndex, 1);
232
+ }
233
+ #createOverlay(renderer) {
234
+ const container = renderer.createElement('div');
235
+ const spinner = renderer.createElement('div');
71
236
  renderer.addClass(container, 'sd-loading');
72
- renderer.setAttribute(container, 'id', this.loadingId);
73
- Object.entries(containerStyle).forEach(entry => {
74
- renderer.setStyle(container, entry[0], entry[1]);
75
- });
237
+ renderer.setAttribute(container, 'role', 'status');
238
+ renderer.setAttribute(container, 'aria-live', 'polite');
239
+ renderer.setAttribute(container, 'aria-label', 'Loading');
76
240
  renderer.addClass(spinner, 'sd-loading-spinner');
77
- Object.entries(spinnerStyle).forEach(entry => {
78
- renderer.setStyle(spinner, entry[0], entry[1]);
79
- });
80
- const styleElement = this.renderer.createElement('style');
81
- this.renderer.appendChild(styleElement, this.renderer.createText(keyframes));
82
- document.head.appendChild(styleElement);
83
- container.appendChild(spinner);
241
+ renderer.setAttribute(spinner, 'aria-hidden', 'true');
242
+ renderer.appendChild(container, spinner);
84
243
  return container;
85
- };
86
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdLoadingService, deps: [{ token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
244
+ }
245
+ #ensureStyles(documentRecord, renderer) {
246
+ let record = documentRecord.style;
247
+ if (record && !this.#isCurrentStyle(record.element)) {
248
+ const owners = record.owners;
249
+ this.#detachOwnedStyleContent(record, renderer);
250
+ record = this.#createStyleRecord(renderer, owners);
251
+ documentRecord.style = record;
252
+ }
253
+ else if (!record) {
254
+ record = this.#createStyleRecord(renderer, new Set());
255
+ documentRecord.style = record;
256
+ }
257
+ else {
258
+ this.#ensureRequiredStyleText(record, renderer);
259
+ }
260
+ record.owners.add(this);
261
+ this.#styleRegistered = true;
262
+ }
263
+ #isCurrentStyle(element) {
264
+ return element.isConnected && element.parentNode === this.#document.head && element.hasAttribute(SD_LOADING_STYLE_ATTRIBUTE);
265
+ }
266
+ #createStyleRecord(renderer, owners) {
267
+ const existing = this.#document.head.querySelector(`style[${SD_LOADING_STYLE_ATTRIBUTE}]`);
268
+ if (existing) {
269
+ const record = {
270
+ element: existing,
271
+ libraryOwned: false,
272
+ owners,
273
+ ownedText: null,
274
+ };
275
+ this.#ensureRequiredStyleText(record, renderer);
276
+ return record;
277
+ }
278
+ const style = renderer.createElement('style');
279
+ const ownedText = renderer.createText(SD_LOADING_STYLES);
280
+ renderer.setAttribute(style, SD_LOADING_STYLE_ATTRIBUTE, '');
281
+ renderer.appendChild(style, ownedText);
282
+ renderer.appendChild(this.#document.head, style);
283
+ return { element: style, libraryOwned: true, owners, ownedText };
284
+ }
285
+ #ensureRequiredStyleText(record, renderer) {
286
+ const currentText = record.element.textContent ?? '';
287
+ const hasRequiredRules = currentText.includes('.sd-loading {') &&
288
+ currentText.includes('.sd-loading-spinner') &&
289
+ currentText.includes('@keyframes sd-loading-spin');
290
+ if (hasRequiredRules)
291
+ return;
292
+ if (record.ownedText && record.ownedText.parentNode !== record.element)
293
+ record.ownedText = null;
294
+ if (!record.ownedText) {
295
+ record.ownedText = renderer.createText(SD_LOADING_STYLES);
296
+ renderer.appendChild(record.element, record.ownedText);
297
+ }
298
+ }
299
+ #detachOwnedStyleContent(record, renderer) {
300
+ if (record.libraryOwned) {
301
+ const parent = record.element.parentNode;
302
+ if (parent)
303
+ renderer.removeChild(parent, record.element);
304
+ }
305
+ else if (record.ownedText) {
306
+ const textParent = record.ownedText.parentNode;
307
+ if (textParent)
308
+ renderer.removeChild(textParent, record.ownedText);
309
+ }
310
+ record.ownedText = null;
311
+ }
312
+ #destroy() {
313
+ if (this.#destroyed)
314
+ return;
315
+ this.#destroyed = true;
316
+ const renderer = this.#renderer;
317
+ if (renderer) {
318
+ for (const state of [...this.#handleQueue])
319
+ this.#closeHandle(state, renderer);
320
+ this.#unregisterStyles(renderer);
321
+ }
322
+ else {
323
+ for (const state of this.#handleQueue) {
324
+ state.closed = true;
325
+ state.contributions.length = 0;
326
+ }
327
+ this.#handleQueue.length = 0;
328
+ }
329
+ }
330
+ #unregisterStyles(renderer) {
331
+ if (!this.#styleRegistered)
332
+ return;
333
+ this.#styleRegistered = false;
334
+ const documentRecord = _a.documentRecords.get(this.#document);
335
+ const record = documentRecord?.style;
336
+ if (!documentRecord || !record)
337
+ return;
338
+ record.owners.delete(this);
339
+ if (record.owners.size === 0) {
340
+ this.#detachOwnedStyleContent(record, renderer);
341
+ documentRecord.style = undefined;
342
+ }
343
+ this.#deleteDocumentRecordWhenEmpty(documentRecord);
344
+ }
345
+ #deleteDocumentRecordWhenEmpty(documentRecord) {
346
+ if (documentRecord.liveHosts.size === 0 && !documentRecord.style) {
347
+ _a.documentRecords.delete(this.#document);
348
+ }
349
+ }
350
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdLoadingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
87
351
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdLoadingService, providedIn: 'root' });
88
352
  }
353
+ _a = SdLoadingService;
89
354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdLoadingService, decorators: [{
90
355
  type: Injectable,
91
356
  args: [{
92
357
  providedIn: 'root',
93
358
  }]
94
- }], ctorParameters: () => [{ type: i0.RendererFactory2 }] });
359
+ }], ctorParameters: () => [] });
95
360
 
96
361
  /**
97
362
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-services-loading.mjs","sources":["../../../projects/sdcorejs-angular/services/loading/src/loading.service.ts","../../../projects/sdcorejs-angular/services/loading/sdcorejs-angular-services-loading.ts"],"sourcesContent":["import { Injectable, Renderer2, RendererFactory2 } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLoadingService {\n private loadingId = 'L8d556b9b-f6dd-46e9-9710-757e65d82839';\n\n private renderer: Renderer2;\n\n private loadingMap = new WeakMap<Element, HTMLElement>();\n constructor(rendererFactory: RendererFactory2) {\n this.renderer = rendererFactory.createRenderer(null, null);\n }\n\n start = (element = 'body') => {\n // why: router tabs can leave multiple hosts with the same selector in the DOM;\n // querySelector would only overlay the first match.\n document.querySelectorAll(element).forEach(ele => {\n if (!this.loadingMap.has(ele)) {\n const loadingElement = this.#createLoading();\n ele.appendChild(loadingElement);\n this.loadingMap.set(ele, loadingElement);\n }\n });\n };\n\n isLoading = (element = 'body') => {\n const nodes = document.querySelectorAll(element);\n if (!nodes.length) return null;\n for (const ele of Array.from(nodes)) {\n if (this.loadingMap.has(ele)) return ele;\n }\n return false;\n };\n\n stop = (element = 'body') => {\n document.querySelectorAll(element).forEach(ele => {\n if (this.loadingMap.has(ele)) {\n this.loadingMap.get(ele)?.remove();\n this.loadingMap.delete(ele);\n }\n });\n };\n\n #createLoading = (): HTMLElement => {\n const renderer = this.renderer;\n const container: HTMLElement = this.renderer.createElement('div');\n const spinner: HTMLElement = this.renderer.createElement('div');\n const containerStyle = {\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: '100%',\n opacity: 0.6,\n background: '#FFFFFF',\n 'z-index': 99999,\n };\n const spinnerStyle = {\n position: 'absolute',\n top: 'calc(50% - 2.5rem)',\n left: 'calc(50% - 2.5rem)',\n width: '5rem',\n height: '5rem',\n border: '0.5rem solid var(--sd-primary)',\n 'border-top': '0.5rem solid var(--sd-border)',\n 'border-radius': '50%',\n animation: 'spin 1s linear infinite',\n };\n const keyframes = `\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `;\n\n renderer.addClass(container, 'sd-loading');\n renderer.setAttribute(container, 'id', this.loadingId);\n\n Object.entries(containerStyle).forEach(entry => {\n renderer.setStyle(container, entry[0], entry[1]);\n });\n\n renderer.addClass(spinner, 'sd-loading-spinner');\n Object.entries(spinnerStyle).forEach(entry => {\n renderer.setStyle(spinner, entry[0], entry[1]);\n });\n\n const styleElement = this.renderer.createElement('style');\n this.renderer.appendChild(styleElement, this.renderer.createText(keyframes));\n document.head.appendChild(styleElement);\n\n container.appendChild(spinner);\n return container;\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MAKa,gBAAgB,CAAA;IACnB,SAAS,GAAG,uCAAuC;AAEnD,IAAA,QAAQ;AAER,IAAA,UAAU,GAAG,IAAI,OAAO,EAAwB;AACxD,IAAA,WAAA,CAAY,eAAiC,EAAA;QAC3C,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;IAC5D;AAEA,IAAA,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,KAAI;;;QAG3B,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;YAC/C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAC7B,gBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;AAC5C,gBAAA,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC;gBAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC;YAC1C;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,SAAS,GAAG,CAAC,OAAO,GAAG,MAAM,KAAI;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QAC9B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACnC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,GAAG;QAC1C;AACA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;AAED,IAAA,IAAI,GAAG,CAAC,OAAO,GAAG,MAAM,KAAI;QAC1B,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;YAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE;AAClC,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,cAAc,GAAG,MAAkB;AACjC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC9B,MAAM,SAAS,GAAgB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QACjE,MAAM,OAAO,GAAgB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC/D,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,GAAG,EAAE,CAAC;AACN,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,OAAO,EAAE,GAAG;AACZ,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,SAAS,EAAE,KAAK;SACjB;AACD,QAAA,MAAM,YAAY,GAAG;AACnB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,GAAG,EAAE,oBAAoB;AACzB,YAAA,IAAI,EAAE,oBAAoB;AAC1B,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,MAAM,EAAE,gCAAgC;AACxC,YAAA,YAAY,EAAE,+BAA+B;AAC7C,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,SAAS,EAAE,yBAAyB;SACrC;AACD,QAAA,MAAM,SAAS,GAAG;;;;;KAKjB;AAED,QAAA,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;QAC1C,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;QAEtD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,KAAK,IAAG;AAC7C,YAAA,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAClD,QAAA,CAAC,CAAC;AAEF,QAAA,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,IAAG;AAC3C,YAAA,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,QAAA,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC5E,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;AAEvC,QAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;AAC9B,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;wGA1FU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACJD;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-services-loading.mjs","sources":["../../../projects/sdcorejs-angular/services/loading/src/loading.service.ts","../../../projects/sdcorejs-angular/services/loading/sdcorejs-angular-services-loading.ts"],"sourcesContent":["import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, Injectable, PLATFORM_ID, Renderer2, RendererFactory2, inject } from '@angular/core';\n\nexport interface SdLoadingRef {\n readonly closed: boolean;\n close(): void;\n}\n\ninterface SdLoadingDocumentRecord {\n readonly hostStates: WeakMap<Element, SdLoadingHostState>;\n readonly liveHosts: Set<Element>;\n style: SdLoadingStyleRecord | undefined;\n}\n\ninterface SdLoadingHostState {\n readonly overlay: HTMLElement;\n readonly previousAriaBusy: string | null;\n readonly contributions: SdLoadingContribution[];\n count: number;\n}\n\ninterface SdLoadingHandleState {\n readonly selector: string;\n readonly contributions: SdLoadingContribution[];\n closed: boolean;\n}\n\ninterface SdLoadingContribution {\n readonly host: Element;\n readonly owner: SdLoadingHandleState;\n readonly service: SdLoadingService;\n released: boolean;\n}\n\ninterface SdLoadingStyleRecord {\n readonly element: HTMLStyleElement;\n readonly libraryOwned: boolean;\n readonly owners: Set<SdLoadingService>;\n ownedText: Text | null;\n}\n\nconst SD_LOADING_STYLE_ATTRIBUTE = 'data-sd-loading-styles';\nconst SD_LOADING_STYLES = `\n.sd-loading {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0.6;\n background: #fff;\n z-index: 99999;\n}\n\n.sd-loading-spinner {\n position: absolute;\n top: calc(50% - 2.5rem);\n left: calc(50% - 2.5rem);\n width: 5rem;\n height: 5rem;\n border: 0.5rem solid var(--sd-primary);\n border-top-color: var(--sd-border);\n border-radius: 50%;\n animation: sd-loading-spin 1s linear infinite;\n}\n\n@keyframes sd-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n`;\n\nconst CLOSED_LOADING_REF: SdLoadingRef = Object.freeze({\n closed: true,\n close(): void {\n // A closed ref deliberately has no work to release.\n },\n});\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLoadingService {\n private static readonly documentRecords = new WeakMap<Document, SdLoadingDocumentRecord>();\n\n readonly #document: Document;\n readonly #renderer: Renderer2 | null;\n readonly #isBrowser: boolean;\n readonly #destroyRef = inject(DestroyRef);\n readonly #handleQueue: SdLoadingHandleState[] = [];\n\n #styleRegistered = false;\n #destroyed = false;\n\n /** Inserted by Angular inject() migration for backwards compatibility. */\n constructor(...args: unknown[]);\n constructor() {\n this.#document = inject(DOCUMENT);\n this.#isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n const rendererFactory = inject(RendererFactory2);\n this.#renderer = this.#isBrowser ? rendererFactory.createRenderer(null, null) : null;\n this.#destroyRef.onDestroy(() => this.#destroy());\n }\n\n /** Starts loading for every current selector match and returns ownership of those exact hosts. */\n start = (selector = 'body'): SdLoadingRef => {\n const renderer = this.#renderer;\n if (this.#destroyed || !this.#isBrowser || !renderer) return CLOSED_LOADING_REF;\n\n const hosts = Array.from(this.#document.querySelectorAll(selector));\n if (hosts.length === 0) return CLOSED_LOADING_REF;\n\n const documentRecord = this.#getOrCreateDocumentRecord();\n this.#ensureStyles(documentRecord, renderer);\n const state: SdLoadingHandleState = { selector, contributions: [], closed: false };\n for (const host of hosts) {\n const contribution: SdLoadingContribution = {\n host,\n owner: state,\n service: this,\n released: false,\n };\n state.contributions.push(contribution);\n this.#acquireHost(documentRecord, contribution, renderer);\n }\n this.#handleQueue.push(state);\n\n return {\n get closed(): boolean {\n return state.closed;\n },\n close: () => this.#closeHandle(state, renderer),\n };\n };\n\n /** Returns the first matched globally loading host, `false` for idle matches, or `null` when unavailable. */\n isLoading = (selector = 'body'): Element | false | null => {\n if (this.#destroyed || !this.#isBrowser) return null;\n\n const hosts = this.#document.querySelectorAll(selector);\n if (hosts.length === 0) return null;\n\n const documentRecord = SdLoadingService.documentRecords.get(this.#document);\n for (const host of Array.from(hosts)) {\n const state = documentRecord?.hostStates.get(host);\n if (state && state.count > 0 && state.overlay.parentNode === host) return host;\n }\n return false;\n };\n\n /** Releases the oldest exact-selector start, with a current-host fallback for legacy cross-selector calls. */\n stop = (selector = 'body'): void => {\n const renderer = this.#renderer;\n if (this.#destroyed || !this.#isBrowser || !renderer) return;\n\n const exactHandle = this.#handleQueue.find(state => !state.closed && state.selector === selector);\n if (exactHandle) {\n this.#closeHandle(exactHandle, renderer);\n return;\n }\n\n const documentRecord = SdLoadingService.documentRecords.get(this.#document);\n if (!documentRecord) return;\n\n for (const host of Array.from(this.#document.querySelectorAll(selector))) {\n const contribution = documentRecord.hostStates\n .get(host)\n ?.contributions.find(candidate => !candidate.released && candidate.service === this);\n if (contribution) this.#releaseContribution(documentRecord, contribution, renderer);\n }\n };\n\n run<T>(task: () => T | PromiseLike<T>, selector?: string): Promise<T>;\n run<T>(task: PromiseLike<T>, selector?: string): Promise<T>;\n /** Runs a task inside a loading lifetime and always releases it without replacing the task result or error. */\n async run<T>(task: (() => T | PromiseLike<T>) | PromiseLike<T>, selector = 'body'): Promise<T> {\n const ref = this.start(selector);\n try {\n const result = typeof task === 'function' ? task() : task;\n return await result;\n } finally {\n ref.close();\n }\n }\n\n #getOrCreateDocumentRecord(): SdLoadingDocumentRecord {\n let record = SdLoadingService.documentRecords.get(this.#document);\n if (!record) {\n record = {\n hostStates: new WeakMap<Element, SdLoadingHostState>(),\n liveHosts: new Set<Element>(),\n style: undefined,\n };\n SdLoadingService.documentRecords.set(this.#document, record);\n }\n return record;\n }\n\n #acquireHost(documentRecord: SdLoadingDocumentRecord, contribution: SdLoadingContribution, renderer: Renderer2): void {\n const host = contribution.host;\n const existing = documentRecord.hostStates.get(host);\n if (existing) {\n this.#repairOverlay(host, existing, renderer);\n existing.count += 1;\n existing.contributions.push(contribution);\n return;\n }\n\n const state: SdLoadingHostState = {\n overlay: this.#createOverlay(renderer),\n previousAriaBusy: host.getAttribute('aria-busy'),\n contributions: [contribution],\n count: 1,\n };\n renderer.setAttribute(host, 'aria-busy', 'true');\n renderer.appendChild(host, state.overlay);\n documentRecord.hostStates.set(host, state);\n documentRecord.liveHosts.add(host);\n }\n\n #repairOverlay(host: Element, state: SdLoadingHostState, renderer: Renderer2): void {\n const currentParent = state.overlay.parentNode;\n if (currentParent !== host) {\n if (currentParent) renderer.removeChild(currentParent, state.overlay);\n renderer.appendChild(host, state.overlay);\n }\n if (host.getAttribute('aria-busy') !== 'true') renderer.setAttribute(host, 'aria-busy', 'true');\n }\n\n #releaseContribution(documentRecord: SdLoadingDocumentRecord, contribution: SdLoadingContribution, renderer: Renderer2): void {\n if (contribution.released) return;\n contribution.released = true;\n\n const state = documentRecord.hostStates.get(contribution.host);\n if (state) {\n const contributionIndex = state.contributions.indexOf(contribution);\n if (contributionIndex >= 0) state.contributions.splice(contributionIndex, 1);\n state.count -= 1;\n\n if (state.count <= 0) this.#removeHost(documentRecord, contribution.host, state, renderer);\n }\n\n contribution.service.#closeOwnerWhenReleased(contribution.owner);\n }\n\n #removeHost(documentRecord: SdLoadingDocumentRecord, host: Element, state: SdLoadingHostState, renderer: Renderer2): void {\n const parent = state.overlay.parentNode;\n if (parent) renderer.removeChild(parent, state.overlay);\n\n if (host.getAttribute('aria-busy') === 'true') {\n if (state.previousAriaBusy === null) renderer.removeAttribute(host, 'aria-busy');\n else renderer.setAttribute(host, 'aria-busy', state.previousAriaBusy);\n }\n\n documentRecord.hostStates.delete(host);\n documentRecord.liveHosts.delete(host);\n this.#deleteDocumentRecordWhenEmpty(documentRecord);\n }\n\n #closeHandle(state: SdLoadingHandleState, renderer: Renderer2): void {\n if (state.closed) return;\n\n state.closed = true;\n this.#dequeueHandle(state);\n const documentRecord = SdLoadingService.documentRecords.get(this.#document);\n if (documentRecord) {\n for (const contribution of [...state.contributions]) {\n this.#releaseContribution(documentRecord, contribution, renderer);\n }\n } else {\n for (const contribution of state.contributions) contribution.released = true;\n }\n state.contributions.length = 0;\n }\n\n #closeOwnerWhenReleased(state: SdLoadingHandleState): void {\n if (state.closed || state.contributions.some(contribution => !contribution.released)) return;\n\n state.closed = true;\n this.#dequeueHandle(state);\n state.contributions.length = 0;\n }\n\n #dequeueHandle(state: SdLoadingHandleState): void {\n const handleIndex = this.#handleQueue.indexOf(state);\n if (handleIndex >= 0) this.#handleQueue.splice(handleIndex, 1);\n }\n\n #createOverlay(renderer: Renderer2): HTMLElement {\n const container: HTMLElement = renderer.createElement('div');\n const spinner: HTMLElement = renderer.createElement('div');\n\n renderer.addClass(container, 'sd-loading');\n renderer.setAttribute(container, 'role', 'status');\n renderer.setAttribute(container, 'aria-live', 'polite');\n renderer.setAttribute(container, 'aria-label', 'Loading');\n\n renderer.addClass(spinner, 'sd-loading-spinner');\n renderer.setAttribute(spinner, 'aria-hidden', 'true');\n renderer.appendChild(container, spinner);\n return container;\n }\n\n #ensureStyles(documentRecord: SdLoadingDocumentRecord, renderer: Renderer2): void {\n let record = documentRecord.style;\n if (record && !this.#isCurrentStyle(record.element)) {\n const owners = record.owners;\n this.#detachOwnedStyleContent(record, renderer);\n record = this.#createStyleRecord(renderer, owners);\n documentRecord.style = record;\n } else if (!record) {\n record = this.#createStyleRecord(renderer, new Set<SdLoadingService>());\n documentRecord.style = record;\n } else {\n this.#ensureRequiredStyleText(record, renderer);\n }\n\n record.owners.add(this);\n this.#styleRegistered = true;\n }\n\n #isCurrentStyle(element: HTMLStyleElement): boolean {\n return element.isConnected && element.parentNode === this.#document.head && element.hasAttribute(SD_LOADING_STYLE_ATTRIBUTE);\n }\n\n #createStyleRecord(renderer: Renderer2, owners: Set<SdLoadingService>): SdLoadingStyleRecord {\n const existing = this.#document.head.querySelector<HTMLStyleElement>(`style[${SD_LOADING_STYLE_ATTRIBUTE}]`);\n if (existing) {\n const record: SdLoadingStyleRecord = {\n element: existing,\n libraryOwned: false,\n owners,\n ownedText: null,\n };\n this.#ensureRequiredStyleText(record, renderer);\n return record;\n }\n\n const style: HTMLStyleElement = renderer.createElement('style');\n const ownedText: Text = renderer.createText(SD_LOADING_STYLES);\n renderer.setAttribute(style, SD_LOADING_STYLE_ATTRIBUTE, '');\n renderer.appendChild(style, ownedText);\n renderer.appendChild(this.#document.head, style);\n return { element: style, libraryOwned: true, owners, ownedText };\n }\n\n #ensureRequiredStyleText(record: SdLoadingStyleRecord, renderer: Renderer2): void {\n const currentText = record.element.textContent ?? '';\n const hasRequiredRules =\n currentText.includes('.sd-loading {') &&\n currentText.includes('.sd-loading-spinner') &&\n currentText.includes('@keyframes sd-loading-spin');\n if (hasRequiredRules) return;\n\n if (record.ownedText && record.ownedText.parentNode !== record.element) record.ownedText = null;\n if (!record.ownedText) {\n record.ownedText = renderer.createText(SD_LOADING_STYLES);\n renderer.appendChild(record.element, record.ownedText);\n }\n }\n\n #detachOwnedStyleContent(record: SdLoadingStyleRecord, renderer: Renderer2): void {\n if (record.libraryOwned) {\n const parent = record.element.parentNode;\n if (parent) renderer.removeChild(parent, record.element);\n } else if (record.ownedText) {\n const textParent = record.ownedText.parentNode;\n if (textParent) renderer.removeChild(textParent, record.ownedText);\n }\n record.ownedText = null;\n }\n\n #destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n const renderer = this.#renderer;\n if (renderer) {\n for (const state of [...this.#handleQueue]) this.#closeHandle(state, renderer);\n this.#unregisterStyles(renderer);\n } else {\n for (const state of this.#handleQueue) {\n state.closed = true;\n state.contributions.length = 0;\n }\n this.#handleQueue.length = 0;\n }\n }\n\n #unregisterStyles(renderer: Renderer2): void {\n if (!this.#styleRegistered) return;\n this.#styleRegistered = false;\n\n const documentRecord = SdLoadingService.documentRecords.get(this.#document);\n const record = documentRecord?.style;\n if (!documentRecord || !record) return;\n\n record.owners.delete(this);\n if (record.owners.size === 0) {\n this.#detachOwnedStyleContent(record, renderer);\n documentRecord.style = undefined;\n }\n this.#deleteDocumentRecordWhenEmpty(documentRecord);\n }\n\n #deleteDocumentRecordWhenEmpty(documentRecord: SdLoadingDocumentRecord): void {\n if (documentRecord.liveHosts.size === 0 && !documentRecord.style) {\n SdLoadingService.documentRecords.delete(this.#document);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { CommonModule, DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { signal, computed, SecurityContext, HostListener, Input, ChangeDetectionStrategy, Component, inject, ApplicationRef, EnvironmentInjector, createComponent, Injectable } from '@angular/core';
3
+ import { inject, signal, computed, SecurityContext, HostListener, Input, ChangeDetectionStrategy, Component, ApplicationRef, EnvironmentInjector, createComponent, Injectable } from '@angular/core';
4
4
  import { Utilities } from '@sdcorejs/utils/fns';
5
5
  import { TranslatePipe, I18nService } from '@sdcorejs/angular/i18n';
6
- import * as i2 from '@angular/platform-browser';
6
+ import { DomSanitizer } from '@angular/platform-browser';
7
7
 
8
8
  const TOAST_EXIT_ANIMATION_MS = 200;
9
9
  class ToastComponent {
10
- notifyService;
11
- sanitizer;
10
+ notifyService = inject(SdNotifyService);
11
+ sanitizer = inject(DomSanitizer);
12
12
  data;
13
13
  isExpanded = signal(false);
14
14
  isClosing = signal(false);
@@ -18,10 +18,7 @@ class ToastComponent {
18
18
  closeTimer = null;
19
19
  start = 0;
20
20
  remaining = 0;
21
- constructor(notifyService, sanitizer) {
22
- this.notifyService = notifyService;
23
- this.sanitizer = sanitizer;
24
- }
21
+ constructor() { }
25
22
  ngOnInit() {
26
23
  this.remaining = this.data.duration;
27
24
  this.resumeTimer();
@@ -108,7 +105,7 @@ class ToastComponent {
108
105
  clearTimeout(this.closeTimer);
109
106
  this.closeTimer = null;
110
107
  }
111
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: ToastComponent, deps: [{ token: SdNotifyService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
112
109
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: ToastComponent, isStandalone: true, selector: "toast", inputs: { data: "data" }, host: { listeners: { "mouseenter": "pauseTimer()", "mouseleave": "resumeTimer()" }, properties: { "class": "hostClasses()", "attr.data-autoid": "autoId", "attr.data-type": "data.type", "attr.data-title": "data.title ?? null", "attr.data-message": "dataMessage" } }, ngImport: i0, template: "<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\n\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\n @switch (data.type) {\n @case ('success') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\n }\n @case ('info') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\n }\n @case ('warning') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\n }\n @case ('error') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\n }\n }\n</div>\n\n<div class=\"sd-toast__content\">\n <div class=\"sd-toast__header\">\n <strong class=\"sd-toast__title\">{{ data.title || ('core.notify.type.' + data.type | translate) }}</strong>\n <button class=\"sd-toast__close\" (click)=\"close()\">&times;</button>\n </div>\n\n <div class=\"sd-toast__body\">\n @if (!isMultiMessage) {\n <!-- Text rendering is the default safe path; HTML is opt-in and sanitized. -->\n @if (data.html) {\n <div [innerHTML]=\"sanitizeHtml(singleMessage)\"></div>\n } @else {\n <div>{{ singleMessage }}</div>\n }\n } @else {\n <ul class=\"msg-list\">\n @for (msg of displayMessages; track msg) {\n @if (data.html) {\n <li [innerHTML]=\"sanitizeHtml('- ' + msg)\"></li>\n } @else {\n <li>{{ '- ' + msg }}</li>\n }\n }\n </ul>\n\n @if (hasMore) {\n <button\n type=\"button\"\n class=\"toggle-more btn-link\"\n [class]=\"'text-' + data.type\"\n (click)=\"toggleExpand()\">\n {{ isExpanded() ? ('core.notify.show-less' | translate) : ('core.notify.show-more' | translate: { count: restCount }) }}\n </button>\n }\n }\n </div>\n\n @if (data.actionLabel) {\n <div class=\"sd-toast__actions\">\n <button\n class=\"btn-action\"\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\n (click)=\"onActionClick()\">\n {{ data.actionLabel }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:flex;width:350px;border-radius:8px;box-shadow:0 4px 12px #00000026;margin-bottom:12px;overflow:hidden;position:relative;font-family:Roboto,sans-serif;pointer-events:auto;animation:sd-toast-enter .3s ease-out}:host(.sd-toast--closing){pointer-events:none;animation:sd-toast-leave .2s ease-in forwards}@keyframes sd-toast-enter{0%{transform:translate(100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes sd-toast-leave{0%{transform:translate(0);opacity:1}to{transform:translate(100%);opacity:0}}@media(prefers-reduced-motion:reduce){:host,:host(.sd-toast--closing){animation:none}}.sd-toast__bar{width:6px;flex-shrink:0}.sd-toast__icon{padding:12px 0 0 12px;flex-shrink:0}.sd-toast__icon svg{width:24px;height:24px}.sd-toast__content{flex-grow:1;padding:12px;display:flex;flex-direction:column}.sd-toast__header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4px}.sd-toast__title{font-size:16px;font-weight:600}.sd-toast__close{background:none;border:none;font-size:16px;cursor:pointer;line-height:1;padding:0;opacity:.5;transition:opacity .2s}.sd-toast__close:hover{opacity:1}.sd-toast__body{font-size:14px;line-height:1.4;word-break:break-word}.sd-toast__actions{display:flex;justify-content:flex-end;margin-top:8px}.msg-list{padding-left:0;list-style:none;margin:0}.toggle-more{background:none;border:none;padding:0;font:inherit;cursor:pointer;font-size:13px;margin-top:4px;font-weight:500;text-align:left}.toggle-more:hover{text-decoration:underline}.toggle-more:focus-visible{outline:2px solid currentColor;outline-offset:2px}.btn-action{border:none;padding:6px 12px;border-radius:4px;font-weight:600;cursor:pointer;font-size:13px;transition:filter .2s}.btn-action:hover{filter:brightness(.95)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
113
110
  }
114
111
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: ToastComponent, decorators: [{
@@ -120,7 +117,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
120
117
  '[attr.data-title]': 'data.title ?? null',
121
118
  '[attr.data-message]': 'dataMessage',
122
119
  }, template: "<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\n\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\n @switch (data.type) {\n @case ('success') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\n }\n @case ('info') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\n }\n @case ('warning') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\n }\n @case ('error') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\n }\n }\n</div>\n\n<div class=\"sd-toast__content\">\n <div class=\"sd-toast__header\">\n <strong class=\"sd-toast__title\">{{ data.title || ('core.notify.type.' + data.type | translate) }}</strong>\n <button class=\"sd-toast__close\" (click)=\"close()\">&times;</button>\n </div>\n\n <div class=\"sd-toast__body\">\n @if (!isMultiMessage) {\n <!-- Text rendering is the default safe path; HTML is opt-in and sanitized. -->\n @if (data.html) {\n <div [innerHTML]=\"sanitizeHtml(singleMessage)\"></div>\n } @else {\n <div>{{ singleMessage }}</div>\n }\n } @else {\n <ul class=\"msg-list\">\n @for (msg of displayMessages; track msg) {\n @if (data.html) {\n <li [innerHTML]=\"sanitizeHtml('- ' + msg)\"></li>\n } @else {\n <li>{{ '- ' + msg }}</li>\n }\n }\n </ul>\n\n @if (hasMore) {\n <button\n type=\"button\"\n class=\"toggle-more btn-link\"\n [class]=\"'text-' + data.type\"\n (click)=\"toggleExpand()\">\n {{ isExpanded() ? ('core.notify.show-less' | translate) : ('core.notify.show-more' | translate: { count: restCount }) }}\n </button>\n }\n }\n </div>\n\n @if (data.actionLabel) {\n <div class=\"sd-toast__actions\">\n <button\n class=\"btn-action\"\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\n (click)=\"onActionClick()\">\n {{ data.actionLabel }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:flex;width:350px;border-radius:8px;box-shadow:0 4px 12px #00000026;margin-bottom:12px;overflow:hidden;position:relative;font-family:Roboto,sans-serif;pointer-events:auto;animation:sd-toast-enter .3s ease-out}:host(.sd-toast--closing){pointer-events:none;animation:sd-toast-leave .2s ease-in forwards}@keyframes sd-toast-enter{0%{transform:translate(100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes sd-toast-leave{0%{transform:translate(0);opacity:1}to{transform:translate(100%);opacity:0}}@media(prefers-reduced-motion:reduce){:host,:host(.sd-toast--closing){animation:none}}.sd-toast__bar{width:6px;flex-shrink:0}.sd-toast__icon{padding:12px 0 0 12px;flex-shrink:0}.sd-toast__icon svg{width:24px;height:24px}.sd-toast__content{flex-grow:1;padding:12px;display:flex;flex-direction:column}.sd-toast__header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4px}.sd-toast__title{font-size:16px;font-weight:600}.sd-toast__close{background:none;border:none;font-size:16px;cursor:pointer;line-height:1;padding:0;opacity:.5;transition:opacity .2s}.sd-toast__close:hover{opacity:1}.sd-toast__body{font-size:14px;line-height:1.4;word-break:break-word}.sd-toast__actions{display:flex;justify-content:flex-end;margin-top:8px}.msg-list{padding-left:0;list-style:none;margin:0}.toggle-more{background:none;border:none;padding:0;font:inherit;cursor:pointer;font-size:13px;margin-top:4px;font-weight:500;text-align:left}.toggle-more:hover{text-decoration:underline}.toggle-more:focus-visible{outline:2px solid currentColor;outline-offset:2px}.btn-action{border:none;padding:6px 12px;border-radius:4px;font-weight:600;cursor:pointer;font-size:13px;transition:filter .2s}.btn-action:hover{filter:brightness(.95)}\n"] }]
123
- }], ctorParameters: () => [{ type: SdNotifyService }, { type: i2.DomSanitizer }], propDecorators: { data: [{
120
+ }], ctorParameters: () => [], propDecorators: { data: [{
124
121
  type: Input,
125
122
  args: [{ required: true }]
126
123
  }], pauseTimer: [{