@sdcorejs/angular 19.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (740) hide show
  1. package/README.md +723 -0
  2. package/assets/fonts/fonts.scss +116 -0
  3. package/assets/fonts/material-icons/material-icons-outlined-v110-latin-regular.woff2 +0 -0
  4. package/assets/fonts/material-icons/material-icons-v145-latin-regular.woff2 +0 -0
  5. package/assets/fonts/material-symbols/material-symbols-v29-latin-regular.woff2 +0 -0
  6. package/assets/fonts/roboto/roboto-v50-latin_vietnamese-500.woff2 +0 -0
  7. package/assets/fonts/roboto/roboto-v50-latin_vietnamese-600.woff2 +0 -0
  8. package/assets/fonts/roboto/roboto-v50-latin_vietnamese-italic.woff2 +0 -0
  9. package/assets/fonts/roboto/roboto-v50-latin_vietnamese-regular.woff2 +0 -0
  10. package/assets/images/coming-soon.svg +23 -0
  11. package/assets/images/data-empty.svg +21 -0
  12. package/assets/images/expired.svg +22 -0
  13. package/assets/images/file-error.svg +28 -0
  14. package/assets/images/filter-empty.svg +20 -0
  15. package/assets/images/filter-required.svg +21 -0
  16. package/assets/images/forbidden.svg +15 -0
  17. package/assets/images/image-error.svg +27 -0
  18. package/assets/images/maintenance.svg +23 -0
  19. package/assets/images/not-found.svg +20 -0
  20. package/assets/images/offline.svg +20 -0
  21. package/assets/images/submitted.svg +18 -0
  22. package/assets/images/success.svg +18 -0
  23. package/assets/images/unauthorized.svg +22 -0
  24. package/assets/images/unknown-error.svg +18 -0
  25. package/assets/scss/README.md +604 -0
  26. package/assets/scss/ckeditor5.scss +88 -0
  27. package/assets/scss/core/color.scss +74 -0
  28. package/assets/scss/core/form.scss +302 -0
  29. package/assets/scss/core/image.scss +35 -0
  30. package/assets/scss/core/scrollbar.scss +30 -0
  31. package/assets/scss/core/utilities/_base.scss +333 -0
  32. package/assets/scss/core/utilities/_border.scss +22 -0
  33. package/assets/scss/core/utilities/_display.scss +10 -0
  34. package/assets/scss/core/utilities/_elevation.scss +80 -0
  35. package/assets/scss/core/utilities/_flexbox.scss +54 -0
  36. package/assets/scss/core/utilities/_gap.scss +9 -0
  37. package/assets/scss/core/utilities/_grid.scss +143 -0
  38. package/assets/scss/core/utilities/_index.scss +17 -0
  39. package/assets/scss/core/utilities/_misc.scss +20 -0
  40. package/assets/scss/core/utilities/_overflow.scss +9 -0
  41. package/assets/scss/core/utilities/_position.scss +8 -0
  42. package/assets/scss/core/utilities/_sizing.scss +28 -0
  43. package/assets/scss/core/utilities/_spacing.scss +31 -0
  44. package/assets/scss/core/utilities/_typography.scss +99 -0
  45. package/assets/scss/sd-core.scss +17 -0
  46. package/assets/scss/themes/default.scss +45 -0
  47. package/assets/scss/themes/material-theme.scss +101 -0
  48. package/components/anchor/index.d.ts +1 -0
  49. package/components/anchor/src/components/anchor/anchor.component.d.ts +22 -0
  50. package/components/anchor/src/components/anchor-item/anchor-item.component.d.ts +13 -0
  51. package/components/anchor/src/components/anchor-nav/anchor-nav.component.d.ts +21 -0
  52. package/components/anchor/src/components/index.d.ts +2 -0
  53. package/components/anchor/src/index.d.ts +2 -0
  54. package/components/anchor/src/models/index.d.ts +1 -0
  55. package/components/anchor/src/models/sd-anchor.model.d.ts +7 -0
  56. package/components/autoid-inspector/index.d.ts +8 -0
  57. package/components/autoid-inspector/src/autoid-inspector.component.d.ts +55 -0
  58. package/components/autoid-inspector/src/models/autoid-element.model.d.ts +55 -0
  59. package/components/autoid-inspector/src/models/autoid-export-format.model.d.ts +6 -0
  60. package/components/autoid-inspector/src/models/autoid-inspector-config.model.d.ts +8 -0
  61. package/components/autoid-inspector/src/services/autoid-audit.service.d.ts +19 -0
  62. package/components/autoid-inspector/src/services/autoid-export.service.d.ts +21 -0
  63. package/components/autoid-inspector/src/services/autoid-highlight.service.d.ts +12 -0
  64. package/components/autoid-inspector/src/services/autoid-scanner.service.d.ts +23 -0
  65. package/components/avatar/index.d.ts +1 -0
  66. package/components/avatar/src/avatar.component.d.ts +19 -0
  67. package/components/badge/index.d.ts +1 -0
  68. package/components/badge/src/badge.component.d.ts +98 -0
  69. package/components/base/index.d.ts +1 -0
  70. package/components/base/src/base-secure.component.d.ts +8 -0
  71. package/components/button/index.d.ts +1 -0
  72. package/components/button/src/button.component.d.ts +42 -0
  73. package/components/chart/index.d.ts +4 -0
  74. package/components/chart/src/bar-chart.component.d.ts +18 -0
  75. package/components/chart/src/doughnut-chart.component.d.ts +16 -0
  76. package/components/chart/src/line-chart.component.d.ts +18 -0
  77. package/components/chart/src/pie-chart.component.d.ts +16 -0
  78. package/components/ckeditor-styles/index.d.ts +1 -0
  79. package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +25 -0
  80. package/components/code-editor/index.d.ts +1 -0
  81. package/components/code-editor/src/code-editor.component.d.ts +25 -0
  82. package/components/document-builder/index.d.ts +4 -0
  83. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +16 -0
  84. package/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.d.ts +4 -0
  85. package/components/document-builder/src/components/index.d.ts +1 -0
  86. package/components/document-builder/src/document-builder.component.d.ts +53 -0
  87. package/components/document-builder/src/document-builder.config.d.ts +21 -0
  88. package/components/document-builder/src/document-builder.model.d.ts +41 -0
  89. package/components/document-builder/src/document-builder.utils.d.ts +10 -0
  90. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +9 -0
  91. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +44 -0
  92. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +57 -0
  93. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +5 -0
  94. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +4 -0
  95. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +31 -0
  96. package/components/document-builder/src/plugins/image-upload/image-upload.plugin.d.ts +5 -0
  97. package/components/document-builder/src/plugins/index.d.ts +11 -0
  98. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +24 -0
  99. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +14 -0
  100. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +15 -0
  101. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +25 -0
  102. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +29 -0
  103. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +35 -0
  104. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +15 -0
  105. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +15 -0
  106. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +15 -0
  107. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +15 -0
  108. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +15 -0
  109. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +15 -0
  110. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +54 -0
  111. package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +24 -0
  112. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +27 -0
  113. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +16 -0
  114. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +25 -0
  115. package/components/document-builder/src/plugins/paste-handler/index.d.ts +35 -0
  116. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +31 -0
  117. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +31 -0
  118. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +29 -0
  119. package/components/document-builder/src/plugins/paste-handler/types.d.ts +30 -0
  120. package/components/document-builder/src/plugins/table-custom/index.d.ts +34 -0
  121. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +51 -0
  122. package/components/editor/index.d.ts +3 -0
  123. package/components/editor/src/configurations/editor.configuration.d.ts +12 -0
  124. package/components/editor/src/configurations/index.d.ts +1 -0
  125. package/components/editor/src/editor.component.d.ts +52 -0
  126. package/components/editor/src/models/editor.model.d.ts +10 -0
  127. package/components/editor/src/models/image-upload.plugin.model.d.ts +51 -0
  128. package/components/editor/src/models/index.d.ts +2 -0
  129. package/components/editor/src/plugins/image-upload/image-upload.plugin.d.ts +22 -0
  130. package/components/editor/src/plugins/image-upload/utils/batch.utils.d.ts +14 -0
  131. package/components/editor/src/plugins/image-upload/utils/index.d.ts +3 -0
  132. package/components/editor/src/plugins/image-upload/utils/style.utils.d.ts +3 -0
  133. package/components/editor/src/plugins/image-upload/utils/validate.utils.d.ts +4 -0
  134. package/components/form-generic/index.d.ts +4 -0
  135. package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +23 -0
  136. package/components/form-generic/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +17 -0
  137. package/components/form-generic/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +14 -0
  138. package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +33 -0
  139. package/components/form-generic/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +26 -0
  140. package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +27 -0
  141. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +35 -0
  142. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +41 -0
  143. package/components/form-generic/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +14 -0
  144. package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +36 -0
  145. package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +15 -0
  146. package/components/form-generic/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +17 -0
  147. package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +21 -0
  148. package/components/form-generic/src/components/form-builder/components/checkbox/control/checkbox-control.component.d.ts +8 -0
  149. package/components/form-generic/src/components/form-builder/components/checkbox/index.d.ts +2 -0
  150. package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +22 -0
  151. package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +16 -0
  152. package/components/form-generic/src/components/form-builder/components/chip-calendar/index.d.ts +2 -0
  153. package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +22 -0
  154. package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +16 -0
  155. package/components/form-generic/src/components/form-builder/components/chip-string/index.d.ts +2 -0
  156. package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +31 -0
  157. package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +21 -0
  158. package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +18 -0
  159. package/components/form-generic/src/components/form-builder/components/datetime/index.d.ts +2 -0
  160. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +47 -0
  161. package/components/form-generic/src/components/form-builder/components/group/attribute/group-attribute.component.d.ts +23 -0
  162. package/components/form-generic/src/components/form-builder/components/group/index.d.ts +1 -0
  163. package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +35 -0
  164. package/components/form-generic/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +30 -0
  165. package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +20 -0
  166. package/components/form-generic/src/components/form-builder/components/html/index.d.ts +2 -0
  167. package/components/form-generic/src/components/form-builder/components/index.d.ts +13 -0
  168. package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +22 -0
  169. package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +17 -0
  170. package/components/form-generic/src/components/form-builder/components/number/index.d.ts +2 -0
  171. package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +22 -0
  172. package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +16 -0
  173. package/components/form-generic/src/components/form-builder/components/radio/index.d.ts +2 -0
  174. package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +22 -0
  175. package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +16 -0
  176. package/components/form-generic/src/components/form-builder/components/select/index.d.ts +2 -0
  177. package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +22 -0
  178. package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +19 -0
  179. package/components/form-generic/src/components/form-builder/components/table/index.d.ts +2 -0
  180. package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +21 -0
  181. package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +16 -0
  182. package/components/form-generic/src/components/form-builder/components/textarea/index.d.ts +2 -0
  183. package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +21 -0
  184. package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +16 -0
  185. package/components/form-generic/src/components/form-builder/components/textfield/index.d.ts +2 -0
  186. package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +27 -0
  187. package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +16 -0
  188. package/components/form-generic/src/components/form-builder/components/upload/index.d.ts +2 -0
  189. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +120 -0
  190. package/components/form-generic/src/components/form-builder/services/builder.service.d.ts +11 -0
  191. package/components/form-generic/src/components/form-builder/services/index.d.ts +1 -0
  192. package/components/form-generic/src/components/form-render/components/index.d.ts +2 -0
  193. package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +30 -0
  194. package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +30 -0
  195. package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +34 -0
  196. package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +32 -0
  197. package/components/form-generic/src/components/form-render/components/item/components/index.d.ts +11 -0
  198. package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +30 -0
  199. package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +38 -0
  200. package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +43 -0
  201. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +51 -0
  202. package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +30 -0
  203. package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +33 -0
  204. package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +36 -0
  205. package/components/form-generic/src/components/form-render/components/item/item.component.d.ts +32 -0
  206. package/components/form-generic/src/components/form-render/components/variable/variable.component.d.ts +22 -0
  207. package/components/form-generic/src/components/form-render/form-render.component.d.ts +39 -0
  208. package/components/form-generic/src/components/index.d.ts +3 -0
  209. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +43 -0
  210. package/components/form-generic/src/configurations/form-generic.configuration.d.ts +6 -0
  211. package/components/form-generic/src/configurations/form.configuration.d.ts +12 -0
  212. package/components/form-generic/src/configurations/index.d.ts +2 -0
  213. package/components/form-generic/src/models/form-generic-component.model.d.ts +318 -0
  214. package/components/form-generic/src/models/form-generic-definition-html.model.d.ts +28 -0
  215. package/components/form-generic/src/models/form-generic-definition-selection.model.d.ts +49 -0
  216. package/components/form-generic/src/models/form-generic-definition-table.model.d.ts +6 -0
  217. package/components/form-generic/src/models/form-generic-expression.model.d.ts +74 -0
  218. package/components/form-generic/src/models/form-generic-template.model.d.ts +6 -0
  219. package/components/form-generic/src/models/form-generic-validation.model.d.ts +30 -0
  220. package/components/form-generic/src/models/form-generic.model.d.ts +7 -0
  221. package/components/form-generic/src/models/form-render/form-render-args.model.d.ts +7 -0
  222. package/components/form-generic/src/models/form-render/form-render-entity.model.d.ts +3 -0
  223. package/components/form-generic/src/models/form-render/index.d.ts +2 -0
  224. package/components/form-generic/src/models/index.d.ts +8 -0
  225. package/components/form-generic/src/pipes/component-viewed.pipe.d.ts +14 -0
  226. package/components/form-generic/src/pipes/expression-feel.pipe.d.ts +10 -0
  227. package/components/form-generic/src/pipes/expression-query.pipe.d.ts +10 -0
  228. package/components/form-generic/src/pipes/expression-view.pipe.d.ts +8 -0
  229. package/components/form-generic/src/pipes/html.pipe.d.ts +11 -0
  230. package/components/form-generic/src/pipes/hyperlink.pipe.d.ts +8 -0
  231. package/components/form-generic/src/pipes/index.d.ts +7 -0
  232. package/components/form-generic/src/pipes/when-expression.pipe.d.ts +13 -0
  233. package/components/form-generic/src/services/form-generic.service.d.ts +26 -0
  234. package/components/form-generic/src/services/form-render.service.d.ts +10 -0
  235. package/components/form-generic/src/services/index.d.ts +2 -0
  236. package/components/history/index.d.ts +1 -0
  237. package/components/history/models/history.model.d.ts +13 -0
  238. package/components/history/pipes/view-date.pipe.d.ts +8 -0
  239. package/components/history/src/history.component.d.ts +7 -0
  240. package/components/import-excel/index.d.ts +2 -0
  241. package/components/import-excel/src/import-excel.component.d.ts +47 -0
  242. package/components/import-excel/src/import-excel.model.d.ts +102 -0
  243. package/components/import-excel/src/pipes/columm-hidden.pipe.d.ts +10 -0
  244. package/components/import-excel/src/pipes/column-transform.pipe.d.ts +11 -0
  245. package/components/index.d.ts +23 -0
  246. package/components/inform/index.d.ts +2 -0
  247. package/components/inform/src/inform-action.directive.d.ts +9 -0
  248. package/components/inform/src/inform.component.d.ts +59 -0
  249. package/components/mini-editor/index.d.ts +2 -0
  250. package/components/mini-editor/src/mini-editor.component.d.ts +91 -0
  251. package/components/mini-editor/src/mini-editor.model.d.ts +44 -0
  252. package/components/modal/index.d.ts +1 -0
  253. package/components/modal/src/modal.component.d.ts +30 -0
  254. package/components/operator/index.d.ts +1 -0
  255. package/components/operator/src/operator.component.d.ts +34 -0
  256. package/components/preview/index.d.ts +4 -0
  257. package/components/preview/src/preview-image/preview-image.component.d.ts +88 -0
  258. package/components/preview/src/preview-image/preview-image.types.d.ts +53 -0
  259. package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +186 -0
  260. package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +84 -0
  261. package/components/query-bar/index.d.ts +2 -0
  262. package/components/query-bar/src/components/actions-bar/actions-bar.component.d.ts +28 -0
  263. package/components/query-bar/src/components/build-chip/build-chip.component.d.ts +67 -0
  264. package/components/query-bar/src/components/chip-popover/chip-popover.component.d.ts +73 -0
  265. package/components/query-bar/src/components/field-picker/field-picker.component.d.ts +37 -0
  266. package/components/query-bar/src/components/inline-chip/inline-chip.component.d.ts +87 -0
  267. package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +71 -0
  268. package/components/query-bar/src/components/popover-chip/popover-chip.component.d.ts +35 -0
  269. package/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.d.ts +39 -0
  270. package/components/query-bar/src/query-bar.component.d.ts +137 -0
  271. package/components/query-bar/src/query-bar.model.d.ts +136 -0
  272. package/components/query-builder/index.d.ts +1 -0
  273. package/components/query-builder/src/query-builder.component.d.ts +26 -0
  274. package/components/quick-action/index.d.ts +1 -0
  275. package/components/quick-action/src/quick-action.component.d.ts +9 -0
  276. package/components/section/index.d.ts +2 -0
  277. package/components/section/src/section-item/section-item.component.d.ts +7 -0
  278. package/components/section/src/section.component.d.ts +18 -0
  279. package/components/side-drawer/index.d.ts +1 -0
  280. package/components/side-drawer/src/side-drawer.component.d.ts +30 -0
  281. package/components/splitter/index.d.ts +3 -0
  282. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +24 -0
  283. package/components/splitter/src/splitter-panel/splitter-panel.component.d.ts +16 -0
  284. package/components/splitter/src/splitter-state.service.d.ts +26 -0
  285. package/components/splitter/src/splitter.component.d.ts +28 -0
  286. package/components/splitter/src/splitter.models.d.ts +23 -0
  287. package/components/stepper/index.d.ts +2 -0
  288. package/components/stepper/src/step.component.d.ts +17 -0
  289. package/components/stepper/src/stepper.component.d.ts +33 -0
  290. package/components/tab/index.d.ts +2 -0
  291. package/components/tab/src/tab-group.component.d.ts +37 -0
  292. package/components/tab/src/tab.component.d.ts +13 -0
  293. package/components/tab-router/index.d.ts +4 -0
  294. package/components/tab-router/src/actions/tab-router.action.d.ts +5 -0
  295. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +22 -0
  296. package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +16 -0
  297. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +15 -0
  298. package/components/tab-router/src/decorators/tab.decorator.d.ts +16 -0
  299. package/components/tab-router/src/events/tab-router.event.d.ts +11 -0
  300. package/components/tab-router/src/models/index.d.ts +1 -0
  301. package/components/tab-router/src/models/tab-router.model.d.ts +21 -0
  302. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +11 -0
  303. package/components/tab-router/src/services/tab-decorator.service.d.ts +9 -0
  304. package/components/tab-router/src/services/tab-router.service.d.ts +27 -0
  305. package/components/table/index.d.ts +11 -0
  306. package/components/table/src/components/column-title/column-title.component.d.ts +10 -0
  307. package/components/table/src/components/command/desktop-command.component.d.ts +14 -0
  308. package/components/table/src/components/command/pipes/command.pipe.d.ts +30 -0
  309. package/components/table/src/components/command/pipes/filter.pipe.d.ts +35 -0
  310. package/components/table/src/components/config/config.component.d.ts +25 -0
  311. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +24 -0
  312. package/components/table/src/components/desktop-cell/view/view.component.d.ts +24 -0
  313. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +32 -0
  314. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +27 -0
  315. package/components/table/src/components/filter/index.d.ts +3 -0
  316. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +42 -0
  317. package/components/table/src/components/index.d.ts +3 -0
  318. package/components/table/src/components/popup-export/popup-export.component.d.ts +51 -0
  319. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +34 -0
  320. package/components/table/src/components/selector-action/selector-action.component.d.ts +16 -0
  321. package/components/table/src/configurations/index.d.ts +1 -0
  322. package/components/table/src/configurations/table.configuration.d.ts +35 -0
  323. package/components/table/src/directives/index.d.ts +6 -0
  324. package/components/table/src/directives/sd-column-resize.directive.d.ts +13 -0
  325. package/components/table/src/directives/sd-table-cell-def.directive.d.ts +16 -0
  326. package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +16 -0
  327. package/components/table/src/directives/sd-table-expand-def.directive.d.ts +13 -0
  328. package/components/table/src/directives/sd-table-filter-def.directive.d.ts +14 -0
  329. package/components/table/src/directives/sd-table-footer-def.directive.d.ts +16 -0
  330. package/components/table/src/directives/sd-table-group-def.directive.d.ts +44 -0
  331. package/components/table/src/directives/sd-table-title-def.directive.d.ts +14 -0
  332. package/components/table/src/directives/sticky-shadow.directive.d.ts +17 -0
  333. package/components/table/src/models/index.d.ts +5 -0
  334. package/components/table/src/models/table-column.model.d.ts +119 -0
  335. package/components/table/src/models/table-command.model.d.ts +25 -0
  336. package/components/table/src/models/table-item.model.d.ts +65 -0
  337. package/components/table/src/models/table-option-config.model.d.ts +42 -0
  338. package/components/table/src/models/table-option-expand.model.d.ts +6 -0
  339. package/components/table/src/models/table-option-export.model.d.ts +42 -0
  340. package/components/table/src/models/table-option-group.model.d.ts +21 -0
  341. package/components/table/src/models/table-option-paginate.model.d.ts +7 -0
  342. package/components/table/src/models/table-option-reload.model.d.ts +7 -0
  343. package/components/table/src/models/table-option-selector.model.d.ts +105 -0
  344. package/components/table/src/models/table-option-sort.model.d.ts +3 -0
  345. package/components/table/src/models/table-option-style.model.d.ts +11 -0
  346. package/components/table/src/models/table-option-tree.model.d.ts +12 -0
  347. package/components/table/src/models/table-option.model.d.ts +181 -0
  348. package/components/table/src/pipes/filter-values.pipe.d.ts +8 -0
  349. package/components/table/src/pipes/index.d.ts +2 -0
  350. package/components/table/src/pipes/sd-group.pipe.d.ts +23 -0
  351. package/components/table/src/pipes/sd-tree.pipe.d.ts +9 -0
  352. package/components/table/src/pipes/selection-disabled.pipe.d.ts +9 -0
  353. package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts +9 -0
  354. package/components/table/src/pipes/selection-visible.pipe.d.ts +9 -0
  355. package/components/table/src/services/column-width.util.d.ts +7 -0
  356. package/components/table/src/services/config.service.d.ts +21 -0
  357. package/components/table/src/services/index.d.ts +3 -0
  358. package/components/table/src/services/table-export/table-export.service.d.ts +26 -0
  359. package/components/table/src/services/table-filter/table-filter.model.d.ts +150 -0
  360. package/components/table/src/services/table-filter/table-filter.service.d.ts +20 -0
  361. package/components/table/src/services/table-format/table-format.service.d.ts +16 -0
  362. package/components/table/src/services/tree/tree.util.d.ts +14 -0
  363. package/components/table/src/table.component.d.ts +137 -0
  364. package/components/upload-file/index.d.ts +2 -0
  365. package/components/upload-file/src/components/preview/preview.component.d.ts +23 -0
  366. package/components/upload-file/src/configurations/index.d.ts +1 -0
  367. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +50 -0
  368. package/components/upload-file/src/pipes/document.pipe.d.ts +8 -0
  369. package/components/upload-file/src/pipes/image.pipe.d.ts +8 -0
  370. package/components/upload-file/src/pipes/index.d.ts +2 -0
  371. package/components/upload-file/src/services/index.d.ts +2 -0
  372. package/components/upload-file/src/services/upload-file.model.d.ts +12 -0
  373. package/components/upload-file/src/services/upload-file.service.d.ts +10 -0
  374. package/components/upload-file/src/upload-file.component.d.ts +85 -0
  375. package/components/view/index.d.ts +1 -0
  376. package/components/view/src/view.component.d.ts +17 -0
  377. package/configurations/index.d.ts +1 -0
  378. package/configurations/src/sd-core.configuration.d.ts +10 -0
  379. package/directives/index.d.ts +6 -0
  380. package/directives/src/sd-desktop.directive.d.ts +7 -0
  381. package/directives/src/sd-hover-copy.directive.d.ts +16 -0
  382. package/directives/src/sd-href.directive.d.ts +9 -0
  383. package/directives/src/sd-mobile.directive.d.ts +7 -0
  384. package/directives/src/sd-scroll.directive.d.ts +14 -0
  385. package/directives/src/sd-tooltip.directive.d.ts +26 -0
  386. package/fesm2022/sdcorejs-angular-components-anchor.mjs +197 -0
  387. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -0
  388. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +723 -0
  389. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -0
  390. package/fesm2022/sdcorejs-angular-components-avatar.mjs +103 -0
  391. package/fesm2022/sdcorejs-angular-components-avatar.mjs.map +1 -0
  392. package/fesm2022/sdcorejs-angular-components-badge.mjs +138 -0
  393. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -0
  394. package/fesm2022/sdcorejs-angular-components-base.mjs +23 -0
  395. package/fesm2022/sdcorejs-angular-components-base.mjs.map +1 -0
  396. package/fesm2022/sdcorejs-angular-components-button.mjs +118 -0
  397. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -0
  398. package/fesm2022/sdcorejs-angular-components-chart.mjs +290 -0
  399. package/fesm2022/sdcorejs-angular-components-chart.mjs.map +1 -0
  400. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +38 -0
  401. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -0
  402. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +128 -0
  403. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -0
  404. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +5053 -0
  405. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -0
  406. package/fesm2022/sdcorejs-angular-components-editor.mjs +1079 -0
  407. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -0
  408. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +6715 -0
  409. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -0
  410. package/fesm2022/sdcorejs-angular-components-history.mjs +51 -0
  411. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -0
  412. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +583 -0
  413. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -0
  414. package/fesm2022/sdcorejs-angular-components-inform.mjs +190 -0
  415. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -0
  416. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +333 -0
  417. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -0
  418. package/fesm2022/sdcorejs-angular-components-modal.mjs +108 -0
  419. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -0
  420. package/fesm2022/sdcorejs-angular-components-operator.mjs +75 -0
  421. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -0
  422. package/fesm2022/sdcorejs-angular-components-preview.mjs +1987 -0
  423. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -0
  424. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +1430 -0
  425. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -0
  426. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +83 -0
  427. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -0
  428. package/fesm2022/sdcorejs-angular-components-quick-action.mjs +22 -0
  429. package/fesm2022/sdcorejs-angular-components-quick-action.mjs.map +1 -0
  430. package/fesm2022/sdcorejs-angular-components-section.mjs +64 -0
  431. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -0
  432. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +129 -0
  433. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -0
  434. package/fesm2022/sdcorejs-angular-components-splitter.mjs +649 -0
  435. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -0
  436. package/fesm2022/sdcorejs-angular-components-stepper.mjs +140 -0
  437. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -0
  438. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +605 -0
  439. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -0
  440. package/fesm2022/sdcorejs-angular-components-tab.mjs +145 -0
  441. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -0
  442. package/fesm2022/sdcorejs-angular-components-table.mjs +4524 -0
  443. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -0
  444. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +868 -0
  445. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -0
  446. package/fesm2022/sdcorejs-angular-components-view.mjs +48 -0
  447. package/fesm2022/sdcorejs-angular-components-view.mjs.map +1 -0
  448. package/fesm2022/sdcorejs-angular-components.mjs +28 -0
  449. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -0
  450. package/fesm2022/sdcorejs-angular-configurations.mjs +10 -0
  451. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -0
  452. package/fesm2022/sdcorejs-angular-directives.mjs +497 -0
  453. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -0
  454. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +454 -0
  455. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -0
  456. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +139 -0
  457. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -0
  458. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +364 -0
  459. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -0
  460. package/fesm2022/sdcorejs-angular-forms-chip.mjs +363 -0
  461. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -0
  462. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +354 -0
  463. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -0
  464. package/fesm2022/sdcorejs-angular-forms-date.mjs +356 -0
  465. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -0
  466. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +748 -0
  467. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -0
  468. package/fesm2022/sdcorejs-angular-forms-directives.mjs +67 -0
  469. package/fesm2022/sdcorejs-angular-forms-directives.mjs.map +1 -0
  470. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +117 -0
  471. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -0
  472. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +438 -0
  473. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -0
  474. package/fesm2022/sdcorejs-angular-forms-input.mjs +354 -0
  475. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -0
  476. package/fesm2022/sdcorejs-angular-forms-label.mjs +51 -0
  477. package/fesm2022/sdcorejs-angular-forms-label.mjs.map +1 -0
  478. package/fesm2022/sdcorejs-angular-forms-models.mjs +137 -0
  479. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -0
  480. package/fesm2022/sdcorejs-angular-forms-radio.mjs +190 -0
  481. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -0
  482. package/fesm2022/sdcorejs-angular-forms-select.mjs +593 -0
  483. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -0
  484. package/fesm2022/sdcorejs-angular-forms-switch.mjs +144 -0
  485. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -0
  486. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +300 -0
  487. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -0
  488. package/fesm2022/sdcorejs-angular-forms.mjs +48 -0
  489. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -0
  490. package/fesm2022/sdcorejs-angular-handlers.mjs +67 -0
  491. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -0
  492. package/fesm2022/sdcorejs-angular-i18n.mjs +2592 -0
  493. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -0
  494. package/fesm2022/sdcorejs-angular-interceptors.mjs +166 -0
  495. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -0
  496. package/fesm2022/sdcorejs-angular-models.mjs +6 -0
  497. package/fesm2022/sdcorejs-angular-models.mjs.map +1 -0
  498. package/fesm2022/sdcorejs-angular-modules-auth.mjs +137 -0
  499. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -0
  500. package/fesm2022/sdcorejs-angular-modules-authom.mjs +360 -0
  501. package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +1 -0
  502. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +127 -0
  503. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -0
  504. package/fesm2022/sdcorejs-angular-modules-layout.mjs +1633 -0
  505. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -0
  506. package/fesm2022/sdcorejs-angular-modules-permission.mjs +249 -0
  507. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -0
  508. package/fesm2022/sdcorejs-angular-modules.mjs +10 -0
  509. package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -0
  510. package/fesm2022/sdcorejs-angular-pipes.mjs +149 -0
  511. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -0
  512. package/fesm2022/sdcorejs-angular-services-api.mjs +235 -0
  513. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -0
  514. package/fesm2022/sdcorejs-angular-services-cache.mjs +161 -0
  515. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -0
  516. package/fesm2022/sdcorejs-angular-services-confirm.mjs +208 -0
  517. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -0
  518. package/fesm2022/sdcorejs-angular-services-docx.mjs +300 -0
  519. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -0
  520. package/fesm2022/sdcorejs-angular-services-excel.mjs +422 -0
  521. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -0
  522. package/fesm2022/sdcorejs-angular-services-license.mjs +104 -0
  523. package/fesm2022/sdcorejs-angular-services-license.mjs.map +1 -0
  524. package/fesm2022/sdcorejs-angular-services-loading.mjs +92 -0
  525. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -0
  526. package/fesm2022/sdcorejs-angular-services-notify.mjs +268 -0
  527. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -0
  528. package/fesm2022/sdcorejs-angular-services-storage.mjs +174 -0
  529. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -0
  530. package/fesm2022/sdcorejs-angular-services.mjs +13 -0
  531. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -0
  532. package/fesm2022/sdcorejs-angular-utilities-data-state.mjs +38 -0
  533. package/fesm2022/sdcorejs-angular-utilities-data-state.mjs.map +1 -0
  534. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +391 -0
  535. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -0
  536. package/fesm2022/sdcorejs-angular-utilities-models.mjs +55 -0
  537. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -0
  538. package/fesm2022/sdcorejs-angular-utilities.mjs +8 -0
  539. package/fesm2022/sdcorejs-angular-utilities.mjs.map +1 -0
  540. package/fesm2022/sdcorejs-angular.mjs +19 -0
  541. package/fesm2022/sdcorejs-angular.mjs.map +1 -0
  542. package/forms/autocomplete/index.d.ts +1 -0
  543. package/forms/autocomplete/src/autocomplete.component.d.ts +93 -0
  544. package/forms/checkbox/index.d.ts +1 -0
  545. package/forms/checkbox/src/checkbox.component.d.ts +28 -0
  546. package/forms/chip/index.d.ts +1 -0
  547. package/forms/chip/src/chip.component.d.ts +71 -0
  548. package/forms/chip/src/index.d.ts +2 -0
  549. package/forms/chip/src/pipes/index.d.ts +1 -0
  550. package/forms/chip/src/pipes/removable-chip.pipe.d.ts +8 -0
  551. package/forms/chip-calendar/index.d.ts +1 -0
  552. package/forms/chip-calendar/src/chip-calendar.component.d.ts +71 -0
  553. package/forms/chip-calendar/src/pipes/index.d.ts +1 -0
  554. package/forms/chip-calendar/src/pipes/removable-chip.pipe.d.ts +8 -0
  555. package/forms/date/index.d.ts +1 -0
  556. package/forms/date/src/date.component.d.ts +79 -0
  557. package/forms/date-range/index.d.ts +1 -0
  558. package/forms/date-range/src/date-range.component.d.ts +81 -0
  559. package/forms/datetime/index.d.ts +1 -0
  560. package/forms/datetime/src/datetime.component.d.ts +89 -0
  561. package/forms/datetime/src/popup/sd-datetime-picker.component.d.ts +37 -0
  562. package/forms/datetime/src/popup/sd-time-spinner.component.d.ts +41 -0
  563. package/forms/directives/index.d.ts +4 -0
  564. package/forms/directives/src/item-def.directive.d.ts +13 -0
  565. package/forms/directives/src/label-def.directive.d.ts +9 -0
  566. package/forms/directives/src/suffix-def.directive.d.ts +9 -0
  567. package/forms/directives/src/view-def.directive.d.ts +14 -0
  568. package/forms/index.d.ts +17 -0
  569. package/forms/input/index.d.ts +1 -0
  570. package/forms/input/src/input.component.d.ts +84 -0
  571. package/forms/input-color/index.d.ts +1 -0
  572. package/forms/input-color/src/input-color.component.d.ts +32 -0
  573. package/forms/input-number/index.d.ts +1 -0
  574. package/forms/input-number/src/input-number.component.d.ts +95 -0
  575. package/forms/label/index.d.ts +1 -0
  576. package/forms/label/src/label.component.d.ts +13 -0
  577. package/forms/models/index.d.ts +6 -0
  578. package/forms/models/src/form-control-state.d.ts +23 -0
  579. package/forms/models/src/sd-custom-validator.model.d.ts +15 -0
  580. package/forms/models/src/sd-form-control.model.d.ts +21 -0
  581. package/forms/models/src/sd-form.configuration.d.ts +6 -0
  582. package/forms/models/src/sd-search.model.d.ts +7 -0
  583. package/forms/models/src/sd-selection-data.model.d.ts +7 -0
  584. package/forms/radio/index.d.ts +1 -0
  585. package/forms/radio/src/radio.component.d.ts +49 -0
  586. package/forms/select/index.d.ts +1 -0
  587. package/forms/select/src/select.component.d.ts +93 -0
  588. package/forms/src/forms.module.d.ts +14 -0
  589. package/forms/switch/index.d.ts +1 -0
  590. package/forms/switch/src/switch.component.d.ts +32 -0
  591. package/forms/textarea/index.d.ts +1 -0
  592. package/forms/textarea/src/textarea.component.d.ts +65 -0
  593. package/handlers/global-error.handler.d.ts +9 -0
  594. package/handlers/index.d.ts +1 -0
  595. package/i18n/index.d.ts +5 -0
  596. package/i18n/src/en.d.ts +449 -0
  597. package/i18n/src/i18n.messages.d.ts +2 -0
  598. package/i18n/src/i18n.pipe.d.ts +9 -0
  599. package/i18n/src/i18n.service.d.ts +14 -0
  600. package/i18n/src/i18n.token.d.ts +1 -0
  601. package/i18n/src/i18n.types.d.ts +31 -0
  602. package/i18n/src/ja.d.ts +2 -0
  603. package/i18n/src/ko.d.ts +2 -0
  604. package/i18n/src/vi.d.ts +2 -0
  605. package/i18n/src/zh.d.ts +2 -0
  606. package/index.d.ts +5 -0
  607. package/interceptors/index.d.ts +2 -0
  608. package/interceptors/no-internet/no-internet.interceptor.d.ts +14 -0
  609. package/interceptors/unauthorized/unauthorized.interceptor.d.ts +12 -0
  610. package/models/index.d.ts +1 -0
  611. package/models/src/language.model.d.ts +2 -0
  612. package/modules/auth/configurations/auth.configuration.d.ts +19 -0
  613. package/modules/auth/configurations/index.d.ts +1 -0
  614. package/modules/auth/guards/auth.guard.d.ts +11 -0
  615. package/modules/auth/guards/index.d.ts +2 -0
  616. package/modules/auth/guards/portal.guard.d.ts +11 -0
  617. package/modules/auth/index.d.ts +3 -0
  618. package/modules/auth/services/auth.model.d.ts +8 -0
  619. package/modules/auth/services/auth.service.d.ts +17 -0
  620. package/modules/auth/services/index.d.ts +2 -0
  621. package/modules/authom/authom.configuration.d.ts +17 -0
  622. package/modules/authom/authom.interceptor.d.ts +3 -0
  623. package/modules/authom/authom.module.d.ts +16 -0
  624. package/modules/authom/authom.service.d.ts +32 -0
  625. package/modules/authom/index.d.ts +35 -0
  626. package/modules/index.d.ts +5 -0
  627. package/modules/keycloak/index.d.ts +4 -0
  628. package/modules/keycloak/keycloak.configuration.d.ts +11 -0
  629. package/modules/keycloak/keycloak.interceptor.d.ts +2 -0
  630. package/modules/keycloak/keycloak.module.d.ts +18 -0
  631. package/modules/keycloak/keycloak.service.d.ts +14 -0
  632. package/modules/layout/components/index.d.ts +4 -0
  633. package/modules/layout/components/layout-main/layout-main.component.d.ts +12 -0
  634. package/modules/layout/components/page/page.component.d.ts +10 -0
  635. package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +35 -0
  636. package/modules/layout/components/sidebar-mobile-v1/components/user/user.component.d.ts +24 -0
  637. package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +21 -0
  638. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +55 -0
  639. package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +22 -0
  640. package/modules/layout/components/sidebar-v1/main.component.d.ts +24 -0
  641. package/modules/layout/configurations/index.d.ts +1 -0
  642. package/modules/layout/configurations/layout.configuration.d.ts +67 -0
  643. package/modules/layout/index.d.ts +5 -0
  644. package/modules/layout/layout.module.d.ts +7 -0
  645. package/modules/layout/layout.routing.d.ts +2 -0
  646. package/modules/layout/modules/forbidden/forbidden.module.d.ts +8 -0
  647. package/modules/layout/modules/forbidden/forbidden.routing.d.ts +2 -0
  648. package/modules/layout/modules/forbidden/index.d.ts +1 -0
  649. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +10 -0
  650. package/modules/layout/modules/home/components/home-page/home-page.component.d.ts +33 -0
  651. package/modules/layout/modules/home/guards/home-redirect.guard.d.ts +11 -0
  652. package/modules/layout/modules/home/home.module.d.ts +8 -0
  653. package/modules/layout/modules/home/home.routing.d.ts +7 -0
  654. package/modules/layout/modules/home/index.d.ts +1 -0
  655. package/modules/layout/modules/index.d.ts +3 -0
  656. package/modules/layout/modules/not-found/index.d.ts +1 -0
  657. package/modules/layout/modules/not-found/not-found.module.d.ts +8 -0
  658. package/modules/layout/modules/not-found/not-found.routing.d.ts +2 -0
  659. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +10 -0
  660. package/modules/layout/pipes/high-light-search.pipe.d.ts +10 -0
  661. package/modules/layout/pipes/index.d.ts +3 -0
  662. package/modules/layout/pipes/menu-focus.pipe.d.ts +10 -0
  663. package/modules/layout/pipes/menu.pipe.d.ts +13 -0
  664. package/modules/layout/services/index.d.ts +3 -0
  665. package/modules/layout/services/layout.service.d.ts +10 -0
  666. package/modules/layout/services/menu/menu.model.d.ts +24 -0
  667. package/modules/layout/services/storage/storage.service.d.ts +13 -0
  668. package/modules/permission/index.d.ts +4 -0
  669. package/modules/permission/src/configurations/index.d.ts +1 -0
  670. package/modules/permission/src/configurations/permission.configuration.d.ts +63 -0
  671. package/modules/permission/src/directives/index.d.ts +1 -0
  672. package/modules/permission/src/directives/permission.directive.d.ts +9 -0
  673. package/modules/permission/src/guards/index.d.ts +1 -0
  674. package/modules/permission/src/guards/permission.guard.d.ts +14 -0
  675. package/modules/permission/src/services/index.d.ts +1 -0
  676. package/modules/permission/src/services/permission.service.d.ts +12 -0
  677. package/package.json +344 -0
  678. package/pipes/index.d.ts +4 -0
  679. package/pipes/src/empty.pipe.d.ts +7 -0
  680. package/pipes/src/format-number.pipe.d.ts +11 -0
  681. package/pipes/src/safe-html.pipe.d.ts +11 -0
  682. package/pipes/src/time-different.pipe.d.ts +13 -0
  683. package/public-api.d.ts +10 -0
  684. package/services/api/index.d.ts +4 -0
  685. package/services/api/src/api.model.d.ts +36 -0
  686. package/services/api/src/api.module.d.ts +6 -0
  687. package/services/api/src/api.service.d.ts +19 -0
  688. package/services/api/src/interceptors/api.interceptor.d.ts +9 -0
  689. package/services/cache/index.d.ts +2 -0
  690. package/services/cache/src/cache.model.d.ts +30 -0
  691. package/services/cache/src/cache.service.d.ts +9 -0
  692. package/services/confirm/index.d.ts +1 -0
  693. package/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.d.ts +46 -0
  694. package/services/confirm/src/lib/confirm.service.d.ts +55 -0
  695. package/services/confirm/src/public-api.d.ts +2 -0
  696. package/services/docx/index.d.ts +1 -0
  697. package/services/docx/src/lib/docx.model.d.ts +9 -0
  698. package/services/docx/src/lib/docx.service.d.ts +15 -0
  699. package/services/docx/src/lib/pandoc-core.d.ts +11 -0
  700. package/services/docx/src/public-api.d.ts +2 -0
  701. package/services/excel/index.d.ts +1 -0
  702. package/services/excel/src/lib/excel.model.d.ts +31 -0
  703. package/services/excel/src/lib/excel.service.d.ts +19 -0
  704. package/services/excel/src/public-api.d.ts +2 -0
  705. package/services/index.d.ts +8 -0
  706. package/services/license/index.d.ts +1 -0
  707. package/services/license/src/license.service.d.ts +10 -0
  708. package/services/loading/index.d.ts +1 -0
  709. package/services/loading/src/loading.service.d.ts +14 -0
  710. package/services/notify/index.d.ts +2 -0
  711. package/services/notify/src/components/toast/toast.component.d.ts +28 -0
  712. package/services/notify/src/components/toast-container.component.d.ts +8 -0
  713. package/services/notify/src/notify.model.d.ts +16 -0
  714. package/services/notify/src/notify.service.d.ts +20 -0
  715. package/services/storage/index.d.ts +2 -0
  716. package/services/storage/src/storage.model.d.ts +20 -0
  717. package/services/storage/src/storage.service.d.ts +10 -0
  718. package/utilities/data-state/index.d.ts +1 -0
  719. package/utilities/data-state/src/data-state.d.ts +11 -0
  720. package/utilities/extensions/index.d.ts +6 -0
  721. package/utilities/extensions/src/array.extension.d.ts +1 -0
  722. package/utilities/extensions/src/color.extension.d.ts +5 -0
  723. package/utilities/extensions/src/date.extension.d.ts +1 -0
  724. package/utilities/extensions/src/number.extension.d.ts +1 -0
  725. package/utilities/extensions/src/string.extension.d.ts +50 -0
  726. package/utilities/extensions/src/utility.extension.d.ts +31 -0
  727. package/utilities/index.d.ts +3 -0
  728. package/utilities/models/index.d.ts +12 -0
  729. package/utilities/models/src/color.model.d.ts +4 -0
  730. package/utilities/models/src/empty.model.d.ts +4 -0
  731. package/utilities/models/src/filter.model.d.ts +12 -0
  732. package/utilities/models/src/icon.model.d.ts +2 -0
  733. package/utilities/models/src/maybe-async.model.d.ts +10 -0
  734. package/utilities/models/src/nested-key-of.model.d.ts +4 -0
  735. package/utilities/models/src/operator.model.d.ts +13 -0
  736. package/utilities/models/src/order.model.d.ts +4 -0
  737. package/utilities/models/src/paging.model.d.ts +8 -0
  738. package/utilities/models/src/pattern.model.d.ts +21 -0
  739. package/utilities/models/src/size.model.d.ts +4 -0
  740. package/utilities/models/src/unwrap-signal.model.d.ts +6 -0
@@ -0,0 +1,1079 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, DestroyRef, ChangeDetectorRef, input, booleanAttribute, computed, model, output, signal, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { NgForm, FormGroup } from '@angular/forms';
5
+ import * as i2 from '@angular/material/form-field';
6
+ import { MatFormFieldModule } from '@angular/material/form-field';
7
+ import * as i3 from '@angular/material/icon';
8
+ import { MatIconModule } from '@angular/material/icon';
9
+ import * as i4 from '@angular/material/tooltip';
10
+ import { MatTooltipModule } from '@angular/material/tooltip';
11
+ import * as i1 from '@ckeditor/ckeditor5-angular';
12
+ import { CKEditorModule } from '@ckeditor/ckeditor5-angular';
13
+ import { Plugin, FileRepository, Image, ImageResize, ImageUpload, ImageStyle, ImageToolbar, ClassicEditor, Essentials, FontColor, FontSize, Paragraph, Bold, Italic, Underline, List, Undo, Widget, Alignment } from 'ckeditor5';
14
+ import { Subject } from 'rxjs';
15
+ import { debounceTime } from 'rxjs/operators';
16
+ import * as uuid from 'uuid';
17
+ import { SdNotifyService } from '@sdcorejs/angular/services';
18
+ import { I18nService } from '@sdcorejs/angular/i18n';
19
+ import { sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';
20
+ import { SdFormControl, HandleSdCustomValidator } from '@sdcorejs/angular/forms/models';
21
+ import { SdCKEditorStyles } from '@sdcorejs/angular/components/ckeditor-styles';
22
+ import { SdLabel } from '@sdcorejs/angular/forms/label';
23
+
24
+ const SD_EDITOR_CONFIGURATION = new InjectionToken('sd.editor.configuration');
25
+
26
+ // Dựa vào file để detect định dạng thay vì chỉ check tên
27
+ // Tránh user gửi file không đúng, ví dụ file docx nhưng đổi tên thành ảnh docx.jpg
28
+ const detectFormatFromBytes = async (file) => {
29
+ const buffer = await file.slice(0, 12).arrayBuffer();
30
+ const b = new Uint8Array(buffer);
31
+ if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff)
32
+ return 'jpg';
33
+ if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47)
34
+ return 'png';
35
+ if (b[0] === 0x52 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x46 && b[8] === 0x57)
36
+ return 'webp';
37
+ if (b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x38)
38
+ return 'gif';
39
+ if (b[4] === 0x66 && b[5] === 0x74 && b[6] === 0x79 && b[7] === 0x70) {
40
+ const brand = String.fromCharCode(b[8], b[9], b[10], b[11]);
41
+ if (brand === 'avif')
42
+ return 'avif';
43
+ if (brand.startsWith('hei'))
44
+ return 'heic';
45
+ }
46
+ return '';
47
+ };
48
+ const getImageInfo = async (file) => {
49
+ const sizeMB = file.size / (1024 * 1024);
50
+ const loadDimensions = new Promise(resolve => {
51
+ const url = URL.createObjectURL(file);
52
+ const img = new window.Image();
53
+ img.onload = () => {
54
+ URL.revokeObjectURL(url);
55
+ resolve({ width: img.naturalWidth, height: img.naturalHeight });
56
+ };
57
+ img.onerror = () => {
58
+ URL.revokeObjectURL(url);
59
+ resolve({ width: 0, height: 0 });
60
+ };
61
+ img.src = url;
62
+ });
63
+ const [format, { width, height }] = await Promise.all([detectFormatFromBytes(file), loadDimensions]);
64
+ return { width, height, sizeMB, format };
65
+ };
66
+ // Helper: gọi i18n.t khi có service; nếu thiếu thì trả empty (Angular wrapper luôn truyền i18n)
67
+ const tr = (i18n, key, params) => i18n?.t(key, params) ?? '';
68
+ const validateImageFile = async (file, validation, onWarning, i18n) => {
69
+ const { width, height, sizeMB, format } = await getImageInfo(file);
70
+ if (validation.allowedFormats !== undefined) {
71
+ const normalizedFormats = validation.allowedFormats.map((f) => {
72
+ const fmt = f.replace(/^\./, '').toLowerCase();
73
+ return fmt === 'jpeg' ? 'jpg' : fmt;
74
+ });
75
+ if (!normalizedFormats.includes(format)) {
76
+ const allowed = normalizedFormats.join(', ');
77
+ onWarning?.(tr(i18n, 'core.component.editor.image.invalid-format', { format, allowed }));
78
+ return false;
79
+ }
80
+ }
81
+ if (validation.maxSizeMB !== undefined && sizeMB > validation.maxSizeMB) {
82
+ const sizeMBFixed = sizeMB.toFixed(2);
83
+ onWarning?.(tr(i18n, 'core.component.editor.image.size-exceeded', { sizeMB: sizeMBFixed, maxSizeMB: validation.maxSizeMB }));
84
+ return false;
85
+ }
86
+ if (validation.minWidth !== undefined && width < validation.minWidth) {
87
+ onWarning?.(tr(i18n, 'core.component.editor.image.min-width', { width, min: validation.minWidth }));
88
+ return false;
89
+ }
90
+ if (validation.minHeight !== undefined && height < validation.minHeight) {
91
+ onWarning?.(tr(i18n, 'core.component.editor.image.min-height', { height, min: validation.minHeight }));
92
+ return false;
93
+ }
94
+ if (validation.maxWidth !== undefined && width > validation.maxWidth) {
95
+ onWarning?.(tr(i18n, 'core.component.editor.image.max-width', { width, max: validation.maxWidth }));
96
+ return false;
97
+ }
98
+ if (validation.maxHeight !== undefined && height > validation.maxHeight) {
99
+ onWarning?.(tr(i18n, 'core.component.editor.image.max-height', { height, max: validation.maxHeight }));
100
+ return false;
101
+ }
102
+ return true;
103
+ };
104
+ const validateAndGetFile = async (loader, validation, onWarning, i18n) => {
105
+ const file = (await loader.file);
106
+ if (!file) {
107
+ throw new Error('No file found');
108
+ }
109
+ if (validation) {
110
+ const valid = await validateImageFile(file, validation, onWarning, i18n);
111
+ if (!valid) {
112
+ throw new Error('Image validation failed');
113
+ }
114
+ }
115
+ return file;
116
+ };
117
+
118
+ const getBatchConfig = (option) => {
119
+ const imageConfig = option?.imageConfig;
120
+ return {
121
+ batchSize: Math.max(1, imageConfig?.batchSize ?? 2),
122
+ maxConcurrent: Math.max(1, imageConfig?.maxConcurrentUploads ?? 2),
123
+ };
124
+ };
125
+ const getActiveBlobUrls = (editor) => {
126
+ const urls = new Set();
127
+ const root = editor.model.document.getRoot();
128
+ if (!root)
129
+ return urls;
130
+ for (const item of editor.model.createRangeIn(root).getItems()) {
131
+ if (item.is('element', 'imageBlock') || item.is('element', 'imageInline')) {
132
+ const src = item.getAttribute('src');
133
+ if (src?.startsWith('blob:'))
134
+ urls.add(src);
135
+ }
136
+ }
137
+ return urls;
138
+ };
139
+ const filterActivePendingFiles = (pendingFiles, activeBlobUrls) => {
140
+ const toUpload = [];
141
+ for (const [blobUrl, file] of pendingFiles) {
142
+ if (activeBlobUrls.has(blobUrl)) {
143
+ toUpload.push([blobUrl, file]);
144
+ }
145
+ else {
146
+ URL.revokeObjectURL(blobUrl);
147
+ pendingFiles.delete(blobUrl);
148
+ }
149
+ }
150
+ return toUpload;
151
+ };
152
+ const runBatchUploads = async (toUpload, uploadFn, batchSize, maxConcurrent) => {
153
+ const batches = [];
154
+ for (let i = 0; i < toUpload.length; i += batchSize) {
155
+ batches.push(toUpload.slice(i, i + batchSize));
156
+ }
157
+ const replacements = new Map();
158
+ const failedBatches = [];
159
+ let head = 0;
160
+ const runWorker = async () => {
161
+ while (head < batches.length) {
162
+ const batch = batches[head++];
163
+ try {
164
+ const details = await uploadFn(batch.map(([, file]) => file));
165
+ if (details.length !== batch.length) {
166
+ throw new Error(`API returned ${details.length} results for ${batch.length} files`);
167
+ }
168
+ batch.forEach(([blobUrl], idx) => {
169
+ replacements.set(blobUrl, details[idx]);
170
+ URL.revokeObjectURL(blobUrl);
171
+ });
172
+ }
173
+ catch {
174
+ failedBatches.push(batch);
175
+ }
176
+ }
177
+ };
178
+ await Promise.all(Array.from({ length: Math.min(maxConcurrent, batches.length) }, runWorker));
179
+ return { replacements, failedBatches };
180
+ };
181
+ const applyReplacementsToEditor = (editor, replacements) => {
182
+ if (replacements.size === 0)
183
+ return;
184
+ editor.model.change(writer => {
185
+ const root = editor.model.document.getRoot();
186
+ for (const item of editor.model.createRangeIn(root).getItems()) {
187
+ if (!item.is('element', 'imageBlock') && !item.is('element', 'imageInline'))
188
+ continue;
189
+ const detail = replacements.get(item.getAttribute('src'));
190
+ if (detail)
191
+ writer.setAttribute('src', detail.cdn, item);
192
+ }
193
+ });
194
+ };
195
+
196
+ const parseStyle = (style) => {
197
+ const map = new Map();
198
+ for (const decl of style.split(';')) {
199
+ const colon = decl.indexOf(':');
200
+ if (colon === -1)
201
+ continue;
202
+ const key = decl.slice(0, colon).trim();
203
+ const value = decl.slice(colon + 1).trim();
204
+ if (key && value)
205
+ map.set(key, value);
206
+ }
207
+ return map;
208
+ };
209
+ const serializeStyle = (map) => [...map.entries()].map(([k, v]) => `${k}:${v}`).join(';');
210
+ const countTextLength = (content) => {
211
+ if (!content)
212
+ return 0;
213
+ const doc = new DOMParser().parseFromString(content, 'text/html');
214
+ doc.querySelectorAll('img, figure').forEach(el => el.remove());
215
+ return doc.body.textContent?.length ?? 0;
216
+ };
217
+ const imageInlineStylesToClasses = (html) => {
218
+ if (!html)
219
+ return html;
220
+ const doc = new DOMParser().parseFromString(html, 'text/html');
221
+ doc.querySelectorAll('figure.image').forEach(figure => {
222
+ const styleMap = parseStyle(figure.getAttribute('style') || '');
223
+ const floatVal = styleMap.get('float') || '';
224
+ const marginVal = styleMap.get('margin') || '';
225
+ const widthVal = styleMap.get('width') || '';
226
+ const hasNumericWidth = /\d/.test(widthVal) && widthVal !== 'fit-content';
227
+ styleMap.delete('display');
228
+ styleMap.delete('max-width');
229
+ styleMap.delete('float');
230
+ styleMap.delete('margin');
231
+ if (widthVal === 'fit-content')
232
+ styleMap.delete('width');
233
+ figure.classList.remove('image-style-align-left', 'image-style-align-right', 'image-style-block-align-left', 'image-style-block-align-right');
234
+ if (floatVal === 'left') {
235
+ figure.classList.add('image-style-align-left');
236
+ }
237
+ else if (floatVal === 'right') {
238
+ figure.classList.add('image-style-align-right');
239
+ }
240
+ else if (marginVal === '0 auto 0 0') {
241
+ figure.classList.add(hasNumericWidth ? 'image-style-align-left' : 'image-style-block-align-left');
242
+ }
243
+ else if (marginVal === '0 0 0 auto') {
244
+ figure.classList.add(hasNumericWidth ? 'image-style-align-right' : 'image-style-block-align-right');
245
+ }
246
+ figure.setAttribute('style', serializeStyle(styleMap));
247
+ if (hasNumericWidth) {
248
+ const img = figure.querySelector('img');
249
+ if (img) {
250
+ const imgStyle = parseStyle(img.getAttribute('style') || '');
251
+ if (imgStyle.get('width') === '100%')
252
+ imgStyle.delete('width');
253
+ if (imgStyle.get('height') === 'auto')
254
+ imgStyle.delete('height');
255
+ const serialized = serializeStyle(imgStyle);
256
+ if (serialized)
257
+ img.setAttribute('style', serialized);
258
+ else
259
+ img.removeAttribute('style');
260
+ }
261
+ }
262
+ });
263
+ return doc.body.innerHTML;
264
+ };
265
+ const imageClassesToInlineStyles = (html) => {
266
+ if (!html)
267
+ return html;
268
+ const doc = new DOMParser().parseFromString(html, 'text/html');
269
+ doc.querySelectorAll('figure.image').forEach(figure => {
270
+ const styleMap = parseStyle(figure.getAttribute('style') || '');
271
+ const classList = figure.classList;
272
+ const hasResizeWidth = styleMap.has('width') && /\d/.test(styleMap.get('width'));
273
+ styleMap.set('display', 'block');
274
+ styleMap.set('max-width', '100%');
275
+ if (classList.contains('image-style-align-left')) {
276
+ if (hasResizeWidth && styleMap.get('width') === '100%') {
277
+ styleMap.delete('float');
278
+ styleMap.set('margin', '0 auto 0 0');
279
+ }
280
+ else {
281
+ styleMap.set('float', 'left');
282
+ styleMap.set('margin', '0 1em 0 0');
283
+ }
284
+ }
285
+ else if (classList.contains('image-style-align-right')) {
286
+ if (hasResizeWidth && styleMap.get('width') === '100%') {
287
+ styleMap.delete('float');
288
+ styleMap.set('margin', '0 0 0 auto');
289
+ }
290
+ else {
291
+ styleMap.set('float', 'right');
292
+ styleMap.set('margin', '0 0 0 1em');
293
+ }
294
+ }
295
+ else if (classList.contains('image-style-block-align-left')) {
296
+ styleMap.delete('float');
297
+ styleMap.set('margin', '0 auto 0 0');
298
+ }
299
+ else if (classList.contains('image-style-block-align-right')) {
300
+ styleMap.delete('float');
301
+ styleMap.set('margin', '0 0 0 auto');
302
+ }
303
+ else {
304
+ styleMap.delete('float');
305
+ styleMap.set('margin', '0 auto');
306
+ }
307
+ if (!hasResizeWidth)
308
+ styleMap.set('width', 'fit-content');
309
+ figure.setAttribute('style', serializeStyle(styleMap));
310
+ if (hasResizeWidth) {
311
+ const img = figure.querySelector('img');
312
+ if (img) {
313
+ const imgStyle = parseStyle(img.getAttribute('style') || '');
314
+ imgStyle.set('width', '100%');
315
+ imgStyle.set('height', 'auto');
316
+ img.setAttribute('style', serializeStyle(imgStyle));
317
+ }
318
+ }
319
+ });
320
+ return doc.body.innerHTML;
321
+ };
322
+
323
+ class UploadQueue {
324
+ #queue = [];
325
+ #running = 0;
326
+ maxConcurrent;
327
+ constructor(maxConcurrent) {
328
+ this.maxConcurrent = maxConcurrent;
329
+ }
330
+ async run(task) {
331
+ if (this.#running >= this.maxConcurrent) {
332
+ await new Promise(resolve => {
333
+ this.#queue.push(resolve);
334
+ });
335
+ }
336
+ this.#running++;
337
+ try {
338
+ return await task();
339
+ }
340
+ finally {
341
+ this.#running--;
342
+ this.#queue.shift()?.();
343
+ }
344
+ }
345
+ }
346
+ class BatchUploadScheduler {
347
+ #pending = [];
348
+ #timer = null;
349
+ #batchSize;
350
+ #uploadFn;
351
+ #queue;
352
+ constructor(batchSize, uploadFn, queue) {
353
+ this.#batchSize = batchSize;
354
+ this.#uploadFn = uploadFn;
355
+ this.#queue = queue;
356
+ }
357
+ enqueue(file) {
358
+ return new Promise((resolve, reject) => {
359
+ this.#pending.push({ file, resolve, reject });
360
+ if (this.#timer) {
361
+ clearTimeout(this.#timer);
362
+ }
363
+ if (this.#pending.length >= this.#batchSize) {
364
+ this.#timer = null;
365
+ this.#flush();
366
+ }
367
+ else {
368
+ this.#timer = setTimeout(() => this.#flush(), 50);
369
+ }
370
+ });
371
+ }
372
+ destroy() {
373
+ if (this.#timer !== null) {
374
+ clearTimeout(this.#timer);
375
+ this.#timer = null;
376
+ }
377
+ this.#pending.splice(0).forEach(p => p.reject(new Error('Upload cancelled')));
378
+ }
379
+ #flush() {
380
+ this.#timer = null;
381
+ const all = this.#pending.splice(0);
382
+ if (all.length === 0) {
383
+ return;
384
+ }
385
+ for (let i = 0; i < all.length; i += this.#batchSize) {
386
+ const batch = all.slice(i, i + this.#batchSize);
387
+ this.#queue
388
+ .run(() => this.#uploadFn(batch.map(p => p.file)))
389
+ .then(details => {
390
+ batch.forEach((p, idx) => {
391
+ if (details && details[idx]) {
392
+ p.resolve(details[idx]);
393
+ }
394
+ else {
395
+ p.reject(new Error('Upload failed: Missing details from server'));
396
+ }
397
+ });
398
+ })
399
+ .catch(err => {
400
+ batch.forEach(p => p.reject(err));
401
+ });
402
+ }
403
+ }
404
+ }
405
+ class DeferredImageUploadAdapter {
406
+ #loader;
407
+ #pendingFiles;
408
+ #imageMetaMap;
409
+ #validation;
410
+ #onWarning;
411
+ #i18n;
412
+ #lazyLoad;
413
+ #currentBlobUrl = null;
414
+ constructor(loader, pendingFiles, imageMetaMap, options) {
415
+ this.#loader = loader;
416
+ this.#pendingFiles = pendingFiles;
417
+ this.#imageMetaMap = imageMetaMap;
418
+ this.#validation = options.validation;
419
+ this.#onWarning = options.onWarning;
420
+ this.#i18n = options.i18n;
421
+ this.#lazyLoad = options.lazyLoad;
422
+ }
423
+ upload = async () => {
424
+ const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning, this.#i18n);
425
+ if (!file)
426
+ throw new Error('Image validation failed');
427
+ this.#currentBlobUrl = URL.createObjectURL(file);
428
+ this.#pendingFiles.set(this.#currentBlobUrl, file);
429
+ this.#imageMetaMap.set(this.#currentBlobUrl, { fileName: file.name, lazyLoad: this.#lazyLoad });
430
+ return { default: this.#currentBlobUrl };
431
+ };
432
+ abort() {
433
+ if (this.#currentBlobUrl) {
434
+ URL.revokeObjectURL(this.#currentBlobUrl);
435
+ this.#pendingFiles.delete(this.#currentBlobUrl);
436
+ this.#imageMetaMap.delete(this.#currentBlobUrl);
437
+ }
438
+ }
439
+ }
440
+ class ImmediateImageUploadAdapter {
441
+ #loader;
442
+ #validation;
443
+ #onWarning;
444
+ #i18n;
445
+ #scheduler;
446
+ #imageMetaMap;
447
+ #lazyLoad;
448
+ constructor(loader, scheduler, imageMetaMap, options) {
449
+ this.#loader = loader;
450
+ this.#scheduler = scheduler;
451
+ this.#imageMetaMap = imageMetaMap;
452
+ this.#validation = options.validation;
453
+ this.#onWarning = options.onWarning;
454
+ this.#i18n = options.i18n;
455
+ this.#lazyLoad = options.lazyLoad;
456
+ }
457
+ upload = async () => {
458
+ const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning, this.#i18n);
459
+ if (!file)
460
+ throw new Error('Image validation failed');
461
+ const detail = await this.#scheduler.enqueue(file);
462
+ this.#imageMetaMap.set(detail.cdn, {
463
+ name: detail.name,
464
+ fileName: file.name,
465
+ idOrKey: detail.idOrKey,
466
+ lazyLoad: this.#lazyLoad,
467
+ });
468
+ return { default: detail.cdn };
469
+ };
470
+ abort() { }
471
+ }
472
+ class EditorImageUploadPlugin extends Plugin {
473
+ pendingFiles = new Map();
474
+ uploadQueue;
475
+ #batchScheduler;
476
+ #imageMetaMap = new Map();
477
+ setMeta(cdnUrl, meta) {
478
+ this.#imageMetaMap.set(cdnUrl, { name: meta.name, idOrKey: meta.idOrKey, lazyLoad: meta.lazyLoad });
479
+ }
480
+ static get pluginName() {
481
+ return 'EditorImageUploadPlugin';
482
+ }
483
+ static get requires() {
484
+ return [FileRepository, Image, ImageResize, ImageUpload, ImageStyle, ImageToolbar];
485
+ }
486
+ init() {
487
+ const editor = this.editor;
488
+ const getOption = editor.config.get('getOption');
489
+ const maxConcurrent = getOption?.()?.imageConfig?.maxConcurrentUploads ?? 2;
490
+ this.uploadQueue = new UploadQueue(maxConcurrent);
491
+ this.#registerSchemaAndConverters();
492
+ this.#listenForSrcChanges();
493
+ editor.editing.view.document.on('clipboardInput', (evt, data) => {
494
+ const dataTransfer = data.dataTransfer;
495
+ if (!dataTransfer)
496
+ return;
497
+ const hasImageFiles = Array.from(dataTransfer.files ?? []).some(f => f.type.startsWith('image/'));
498
+ const hasImageInHtml = /<img[\s>]/i.test(dataTransfer.getData('text/html') ?? '');
499
+ if (hasImageFiles || hasImageInHtml) {
500
+ evt.stop();
501
+ }
502
+ }, { priority: 'highest' });
503
+ const uploadImageCommand = editor.commands.get('uploadImage');
504
+ if (uploadImageCommand) {
505
+ uploadImageCommand.on('execute', (evt, args) => {
506
+ const options = args[0] || {};
507
+ const option = getOption?.();
508
+ const maxPerSelection = option?.imageConfig?.maxImagesPerSelection;
509
+ if (maxPerSelection !== undefined) {
510
+ const files = Array.isArray(options?.file) ? options.file : options?.file ? [options.file] : [];
511
+ if (files.length > maxPerSelection) {
512
+ // Angular wrapper luôn truyền _i18n; nếu thiếu thì warning sẽ là chuỗi rỗng (i18n service tự log missing key)
513
+ const msg = option?._i18n?.t('core.component.editor.image.max-per-selection', { max: maxPerSelection }) ?? '';
514
+ option?.onWarning?.(msg);
515
+ evt.stop();
516
+ }
517
+ }
518
+ }, { priority: 'high' });
519
+ }
520
+ editor.once('ready', () => {
521
+ const notification = editor.plugins.get('Notification');
522
+ notification?.on('show:warning', (evt) => {
523
+ evt.stop();
524
+ }, { priority: 'highest' });
525
+ });
526
+ editor.plugins.get('FileRepository').createUploadAdapter = (loader) => {
527
+ const option = getOption?.();
528
+ const imageConfig = option?.imageConfig;
529
+ const uploadMode = imageConfig?.uploadMode ?? 'deferred';
530
+ const validation = imageConfig?.validation;
531
+ const onWarning = option?.onWarning;
532
+ const i18n = option?._i18n;
533
+ const lazyLoad = imageConfig?.lazyLoad ?? true;
534
+ if (uploadMode === 'deferred') {
535
+ return new DeferredImageUploadAdapter(loader, this.pendingFiles, this.#imageMetaMap, { validation, onWarning, i18n, lazyLoad });
536
+ }
537
+ if (!this.#batchScheduler) {
538
+ const uploadFn = option?.uploadFn;
539
+ if (uploadFn) {
540
+ const batchSize = imageConfig?.batchSize ?? 2;
541
+ this.#batchScheduler = new BatchUploadScheduler(batchSize, uploadFn, this.uploadQueue);
542
+ }
543
+ }
544
+ if (!this.#batchScheduler) {
545
+ throw new Error('No upload function configured');
546
+ }
547
+ return new ImmediateImageUploadAdapter(loader, this.#batchScheduler, this.#imageMetaMap, { validation, onWarning, i18n, lazyLoad });
548
+ };
549
+ }
550
+ destroy() {
551
+ super.destroy();
552
+ this.#batchScheduler?.destroy();
553
+ for (const blobUrl of this.pendingFiles.keys()) {
554
+ URL.revokeObjectURL(blobUrl);
555
+ }
556
+ this.pendingFiles.clear();
557
+ this.#imageMetaMap.clear();
558
+ }
559
+ #registerSchemaAndConverters() {
560
+ const editor = this.editor;
561
+ const schema = editor.model.schema;
562
+ for (const type of ['imageBlock', 'imageInline']) {
563
+ if (schema.isRegistered(type)) {
564
+ schema.extend(type, { allowAttributes: ['loading', 'imageId'] });
565
+ }
566
+ }
567
+ // Downcast: model → HTML view
568
+ editor.conversion.for('downcast').add((dispatcher) => {
569
+ for (const [modelAttr, htmlAttr] of [
570
+ ['loading', 'loading'],
571
+ ['imageId', 'id'],
572
+ ]) {
573
+ const handleAttribute = (isBlock) => (evt, data, conversionApi) => {
574
+ if (!conversionApi.consumable.consume(data.item, evt.name))
575
+ return;
576
+ const viewElement = conversionApi.mapper.toViewElement(data.item);
577
+ const viewImg = isBlock ? this.#findImg(viewElement) : viewElement;
578
+ if (!viewImg)
579
+ return;
580
+ if (data.attributeNewValue != null) {
581
+ conversionApi.writer.setAttribute(htmlAttr, String(data.attributeNewValue), viewImg);
582
+ }
583
+ else {
584
+ conversionApi.writer.removeAttribute(htmlAttr, viewImg);
585
+ }
586
+ };
587
+ dispatcher.on(`attribute:${modelAttr}:imageBlock`, handleAttribute(true));
588
+ dispatcher.on(`attribute:${modelAttr}:imageInline`, handleAttribute(false));
589
+ }
590
+ });
591
+ // Upcast: HTML → model
592
+ editor.conversion.for('upcast').add((dispatcher) => {
593
+ dispatcher.on('element:figure', (_evt, data, conversionApi) => {
594
+ if (!data.viewItem.hasClass('image'))
595
+ return;
596
+ const modelElement = data.modelRange?.start?.nodeAfter;
597
+ if (!modelElement)
598
+ return;
599
+ const viewImg = this.#findImg(data.viewItem);
600
+ if (!viewImg)
601
+ return;
602
+ this.#transferHtmlAttrsToModel(viewImg, modelElement, conversionApi);
603
+ }, { priority: 'low' });
604
+ dispatcher.on('element:img', (_evt, data, conversionApi) => {
605
+ const modelElement = data.modelRange?.start?.nodeAfter;
606
+ if (!modelElement)
607
+ return;
608
+ this.#transferHtmlAttrsToModel(data.viewItem, modelElement, conversionApi);
609
+ }, { priority: 'low' });
610
+ });
611
+ }
612
+ #listenForSrcChanges() {
613
+ const editor = this.editor;
614
+ editor.model.document.on('change', () => {
615
+ const changes = editor.model.document.differ.getChanges();
616
+ const updates = [];
617
+ for (const change of changes) {
618
+ if (change.type !== 'attribute' || change.attributeKey !== 'src')
619
+ continue;
620
+ const newSrc = change.attributeNewValue;
621
+ const meta = this.#imageMetaMap.get(newSrc);
622
+ if (!meta)
623
+ continue;
624
+ const node = change.range?.start?.nodeAfter;
625
+ if (node?.is('element')) {
626
+ updates.push({ element: node, meta });
627
+ this.#imageMetaMap.delete(newSrc);
628
+ }
629
+ }
630
+ if (updates.length === 0)
631
+ return;
632
+ editor.model.enqueueChange('transparent', (writer) => {
633
+ for (const { element, meta } of updates) {
634
+ if (meta.name || meta.fileName) {
635
+ writer.setAttribute('alt', meta.name || this.#generateAlt(meta.fileName), element);
636
+ }
637
+ if (meta.lazyLoad) {
638
+ writer.setAttribute('loading', 'lazy', element);
639
+ }
640
+ if (meta.idOrKey) {
641
+ writer.setAttribute('imageId', meta.idOrKey, element);
642
+ }
643
+ }
644
+ });
645
+ });
646
+ }
647
+ #findImg(viewElement) {
648
+ if (!viewElement)
649
+ return null;
650
+ if (viewElement.is?.('element', 'img'))
651
+ return viewElement;
652
+ for (const child of viewElement.getChildren?.() ?? []) {
653
+ if (child.is?.('element', 'img'))
654
+ return child;
655
+ }
656
+ return null;
657
+ }
658
+ #transferHtmlAttrsToModel(viewImg, modelElement, conversionApi) {
659
+ const schema = this.editor.model.schema;
660
+ if (viewImg.hasAttribute('loading') && schema.checkAttribute(modelElement, 'loading')) {
661
+ conversionApi.writer.setAttribute('loading', viewImg.getAttribute('loading'), modelElement);
662
+ }
663
+ if (viewImg.hasAttribute('id') && schema.checkAttribute(modelElement, 'imageId')) {
664
+ conversionApi.writer.setAttribute('imageId', viewImg.getAttribute('id'), modelElement);
665
+ }
666
+ }
667
+ #generateAlt(fileName) {
668
+ if (!fileName)
669
+ return 'Image';
670
+ const nameWithoutExt = fileName.replace(/\.[^.]+$/, '');
671
+ const result = nameWithoutExt
672
+ .replace(/[_\-\.]+/g, ' ')
673
+ .replace(/\s+/g, ' ')
674
+ .trim();
675
+ return result || 'Image';
676
+ }
677
+ }
678
+
679
+ class SdEditor {
680
+ // Injected
681
+ #destroyRef = inject(DestroyRef);
682
+ #cdRef = inject(ChangeDetectorRef);
683
+ #uploadConfig = inject(SD_EDITOR_CONFIGURATION, { optional: true });
684
+ #notifyService = inject(SdNotifyService);
685
+ #i18n = inject(I18nService);
686
+ // Input
687
+ option = input({});
688
+ height = input('250px'); // Chiều dài height hiển thị mặc định
689
+ maxHeight = input('250px'); // Chiều dài tối đa mở rộng nếu nội dung vượt quá height mặc định
690
+ maxlength = input(undefined);
691
+ label = input();
692
+ helperText = input();
693
+ required = input(false, { transform: booleanAttribute });
694
+ disabled = input(false, { transform: booleanAttribute });
695
+ readonly = input(false, { transform: booleanAttribute });
696
+ hideInlineError = input(false, { transform: booleanAttribute });
697
+ inlineError = input();
698
+ placeholder = input();
699
+ validator = input();
700
+ form = input(undefined, {
701
+ transform: (val) => {
702
+ if (!val)
703
+ return undefined;
704
+ if (val instanceof NgForm)
705
+ return val.form;
706
+ if (val instanceof FormGroup)
707
+ return val;
708
+ if (val?.form instanceof FormGroup)
709
+ return val.form;
710
+ return undefined;
711
+ },
712
+ });
713
+ key = input(undefined);
714
+ autoIdInput = input(undefined, { alias: 'autoId' });
715
+ autoId = computed(() => (this.autoIdInput() ? `components-editor-${this.autoIdInput()}` : undefined));
716
+ dataDisabled = computed(() => (this.disabled() ? 'true' : 'false'));
717
+ dataEmpty = computed(() => (sdIsEmpty(this.valueModel()) ? 'true' : 'false'));
718
+ name = input(uuid.v4());
719
+ valueModel = model('', { alias: 'model' });
720
+ // Output
721
+ sdChange = output();
722
+ sdBlur = output();
723
+ sdFocus = output();
724
+ // State
725
+ _textLength = signal(0);
726
+ formControl = new SdFormControl();
727
+ isOverLimit = computed(() => {
728
+ const max = this.maxlength();
729
+ return max !== undefined && this._textLength() > max;
730
+ });
731
+ get errorMessage() {
732
+ const errors = this.formControl.errors;
733
+ if (!errors)
734
+ return undefined;
735
+ if (errors['required'])
736
+ return this.#i18n.t('core.component.editor.required');
737
+ if (errors['maxlength'])
738
+ return this.#i18n.t('core.component.editor.maxlength', { max: this.maxlength() ?? 0 });
739
+ if (errors['customValidator'])
740
+ return errors['customValidator'];
741
+ if (errors['inlineError'])
742
+ return this.inlineError();
743
+ return undefined;
744
+ }
745
+ Editor = ClassicEditor;
746
+ #editor;
747
+ #contentChangeSubject = new Subject();
748
+ editorConfig = computed(() => {
749
+ const opt = this.option();
750
+ const uploadFn = this.#buildUploadFn();
751
+ const enableImageUpload = !!uploadFn;
752
+ const plugins = [Essentials, FontColor, FontSize, Paragraph, Bold, Italic, Underline, List, Undo, Widget, Alignment];
753
+ if (enableImageUpload)
754
+ plugins.push(EditorImageUploadPlugin);
755
+ const toolbarItems = [
756
+ 'bold',
757
+ 'italic',
758
+ 'underline',
759
+ '|',
760
+ 'fontSize',
761
+ 'fontColor',
762
+ '|',
763
+ 'alignment:left',
764
+ 'alignment:center',
765
+ 'alignment:right',
766
+ 'alignment:justify',
767
+ '|',
768
+ 'bulletedList',
769
+ 'numberedList',
770
+ ];
771
+ if (enableImageUpload)
772
+ toolbarItems.push('|', 'uploadImage');
773
+ const config = {
774
+ licenseKey: 'GPL',
775
+ getOption: () => ({
776
+ ...opt,
777
+ uploadFn,
778
+ onWarning: (msg) => this.#notifyService.warning(msg),
779
+ // Truyền i18n service xuống CKEditor plugin (ngoài DI tree) để dịch warning messages
780
+ _i18n: this.#i18n,
781
+ }),
782
+ plugins,
783
+ toolbar: { items: toolbarItems, shouldNotGroupWhenFull: true },
784
+ placeholder: this.placeholder(),
785
+ fontColor: { columns: 5, documentColors: 10, colorPicker: { format: 'hex' } },
786
+ fontSize: { options: [10, 11, 12, 14, 16, 18, 20], supportAllValues: true },
787
+ };
788
+ if (enableImageUpload) {
789
+ config.image = {
790
+ resizeUnit: '%',
791
+ resizeOptions: [
792
+ { name: 'resizeImage:100', value: '100', label: '100%' },
793
+ { name: 'resizeImage:75', value: '75', label: '75%' },
794
+ { name: 'resizeImage:50', value: '50', label: '50%' },
795
+ { name: 'resizeImage:25', value: '25', label: '25%' },
796
+ { name: 'resizeImage:original', value: null, label: 'Original' },
797
+ ],
798
+ toolbar: ['resizeImage', '|', 'imageStyle:alignBlockLeft', 'imageStyle:alignCenter', 'imageStyle:alignBlockRight'],
799
+ };
800
+ }
801
+ return config;
802
+ });
803
+ constructor() {
804
+ this.#validateDuplicateConfigKeys();
805
+ this.#setupEffects();
806
+ this.#setupSubscriptions();
807
+ this.#setupDestroy();
808
+ }
809
+ onReady = (editor) => {
810
+ this.#editor = editor;
811
+ const currentValue = this.valueModel();
812
+ if (currentValue) {
813
+ this.#setToEditor(currentValue);
814
+ }
815
+ if (this.formControl.disabled) {
816
+ editor.enableReadOnlyMode('sd-editor');
817
+ }
818
+ if (this.readonly()) {
819
+ editor.enableReadOnlyMode('sd-editor-readonly');
820
+ }
821
+ editor.model.document.registerPostFixer(writer => {
822
+ let changed = false;
823
+ for (const change of editor.model.document.differ.getChanges()) {
824
+ if (change.type === 'insert' && (change.name === 'imageBlock' || change.name === 'imageInline')) {
825
+ const element = change.position.nodeAfter;
826
+ if (element && !element.hasAttribute('resizedWidth')) {
827
+ writer.setAttribute('resizedWidth', '100%', element);
828
+ changed = true;
829
+ }
830
+ }
831
+ }
832
+ return changed;
833
+ });
834
+ editor.model.document.on('change:data', () => this.#contentChangeSubject.next(editor.getData()));
835
+ editor.editing.view.document.on('focus', evt => this.sdFocus.emit(evt.domEvent));
836
+ editor.editing.view.document.on('blur', evt => {
837
+ this.sdBlur.emit(evt.domEvent);
838
+ this.formControl.markAsTouched();
839
+ this.#cdRef.markForCheck();
840
+ });
841
+ };
842
+ focusEditor = () => this.#editor?.editing?.view?.focus?.();
843
+ /**
844
+ * Xử lý tải lên các file và trả về nội dung dữ liệu cuối cùng.
845
+ * * @description
846
+ * - Đối với các file upload chế độ 'deferred' (chỉ xử lý khi submit), cần @ViewChild component và gọi hàm upload() này.
847
+ * - Hỗ trợ two-way binding.
848
+ * - Hàm hỗ trợ trả ra data cuối cùng.
849
+ * * @returns {Promise<string>} Nội dung cuối cùng được trích xuất từ sd-editor.
850
+ */
851
+ upload = async () => {
852
+ await this.#uploadImages();
853
+ return this.#getFromEditor();
854
+ };
855
+ // Editor Content
856
+ #setToEditor(html) {
857
+ this.#editor?.setData?.(this.#normalizeHtmlForEditor(html));
858
+ }
859
+ #getFromEditor() {
860
+ return this.#editor ? this.#normalizeEditorToHtml(this.#editor.getData()) : '';
861
+ }
862
+ // Normalize HTML từ bên ngoài -> format CKEditor.
863
+ #normalizeHtmlForEditor = (html) => {
864
+ if (!html) {
865
+ return '';
866
+ }
867
+ let result = html;
868
+ result = imageInlineStylesToClasses(result);
869
+ return result;
870
+ };
871
+ // Normalize HTML từ CKEditor → format HTML.
872
+ #normalizeEditorToHtml = (html) => {
873
+ if (!html) {
874
+ return '';
875
+ }
876
+ let result = html;
877
+ result = imageClassesToInlineStyles(result);
878
+ return result;
879
+ };
880
+ // Xử lý binding 2 chiều
881
+ #onModelSignalChange(html) {
882
+ const v = html ?? '';
883
+ if (this.formControl.value === v) {
884
+ return;
885
+ }
886
+ this.formControl.setValue(v, { emitEvent: false });
887
+ this._textLength.set(countTextLength(v));
888
+ if (this.#editor) {
889
+ this.#setToEditor(v);
890
+ }
891
+ }
892
+ // Xử lý khi user soạn thảo
893
+ #onEditorUserInput(rawHtml) {
894
+ const out = imageClassesToInlineStyles(rawHtml);
895
+ this._textLength.set(countTextLength(out));
896
+ if (this.formControl.value !== out) {
897
+ this.formControl.setValue(out, { emitEvent: false });
898
+ }
899
+ this.formControl.updateValueAndValidity({ emitEvent: false });
900
+ this.formControl.sdChanges.next(true);
901
+ this.valueModel.set(out);
902
+ this.sdChange.emit(out);
903
+ }
904
+ // Xử lý nếu dev sử dụng form và set trực tiếp data
905
+ #onFormGroupExternalChange(html) {
906
+ const v = html ?? '';
907
+ this.valueModel.set(v);
908
+ this._textLength.set(countTextLength(v));
909
+ if (this.#editor) {
910
+ this.#setToEditor(v);
911
+ }
912
+ }
913
+ // Validators
914
+ #requiredValidator() {
915
+ return () => (this._textLength() ? null : { required: true });
916
+ }
917
+ #maxLengthValidator() {
918
+ return () => {
919
+ const max = this.maxlength();
920
+ const len = this._textLength();
921
+ return len > max ? { maxlength: { requiredLength: max, actualLength: len } } : null;
922
+ };
923
+ }
924
+ #inlineErrorValidator() {
925
+ return () => ({ inlineError: true });
926
+ }
927
+ #updateValidators() {
928
+ const validators = [];
929
+ const asyncValidators = [];
930
+ if (this.required()) {
931
+ validators.push(this.#requiredValidator());
932
+ }
933
+ if (this.maxlength() !== undefined) {
934
+ validators.push(this.#maxLengthValidator());
935
+ }
936
+ if (this.inlineError()) {
937
+ validators.push(this.#inlineErrorValidator());
938
+ }
939
+ const val = this.validator();
940
+ if (val) {
941
+ asyncValidators.push(HandleSdCustomValidator(val));
942
+ }
943
+ this.formControl.setValidators(validators.length ? validators : null);
944
+ this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);
945
+ this.formControl.updateValueAndValidity({ emitEvent: false });
946
+ }
947
+ // Setup
948
+ #setupEffects() {
949
+ // Lắng nghe disabled
950
+ effect(() => {
951
+ this.disabled() ? this.formControl.disable({ emitEvent: false }) : this.formControl.enable({ emitEvent: false });
952
+ });
953
+ // Lắng nghe readonly
954
+ effect(() => {
955
+ if (!this.#editor) {
956
+ return;
957
+ }
958
+ if (this.readonly()) {
959
+ this.#editor.enableReadOnlyMode('sd-editor-readonly');
960
+ }
961
+ else {
962
+ this.#editor.disableReadOnlyMode('sd-editor-readonly');
963
+ }
964
+ });
965
+ // Lắng nghe binđing 2 chiều model
966
+ effect(() => this.#onModelSignalChange(this.valueModel()));
967
+ // Lắng nghe name form
968
+ effect(() => this.form()?.addControl(this.name(), this.formControl));
969
+ // Lắng nghe validators
970
+ effect(() => {
971
+ this.required();
972
+ this.maxlength();
973
+ this.inlineError();
974
+ this.validator();
975
+ this.#updateValidators();
976
+ });
977
+ }
978
+ #setupSubscriptions() {
979
+ // Đăng ký nếu dev sử dụng form để set data trực tiếp từ bên ngoài vào
980
+ this.formControl.valueChanges
981
+ .pipe(takeUntilDestroyed(this.#destroyRef))
982
+ .subscribe((val) => this.#onFormGroupExternalChange(val));
983
+ this.formControl.sdChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => this.#cdRef.markForCheck());
984
+ // Đăng ký user gõ trong editor
985
+ this.#contentChangeSubject
986
+ .pipe(debounceTime(100), takeUntilDestroyed(this.#destroyRef))
987
+ .subscribe(rawHtml => this.#onEditorUserInput(rawHtml));
988
+ }
989
+ #setupDestroy() {
990
+ this.#destroyRef.onDestroy(() => {
991
+ this.form()?.removeControl(this.name());
992
+ this.#editor?.destroy?.();
993
+ });
994
+ }
995
+ // Helpers
996
+ #uploadImages = async () => {
997
+ const uploadMode = this.option()?.imageConfig?.uploadMode ?? 'deferred';
998
+ // Early return nếu không phải 'deferred' mode.
999
+ // Nếu trước đó là mode "deferred" mà mong muốn chuyển sang mode "immediate", dev chưa cần refactor code phía caller mà không ảnh hưởng đến logic.
1000
+ if (uploadMode !== 'deferred')
1001
+ return;
1002
+ const uploadFn = this.#buildUploadFn();
1003
+ if (!uploadFn) {
1004
+ throw new Error('No upload function configured for image upload');
1005
+ }
1006
+ const plugin = this.#editor?.plugins?.get(EditorImageUploadPlugin);
1007
+ if (!plugin || plugin.pendingFiles.size === 0)
1008
+ return;
1009
+ const { batchSize, maxConcurrent } = getBatchConfig(this.option());
1010
+ const activeBlobUrls = this.#editor ? getActiveBlobUrls(this.#editor) : new Set();
1011
+ const toUpload = filterActivePendingFiles(plugin.pendingFiles, activeBlobUrls);
1012
+ // Capture trước await để tránh race condition: ảnh được chèn trong lúc chờ API
1013
+ const processedBlobUrls = new Set(toUpload.map(([blobUrl]) => blobUrl));
1014
+ const { replacements, failedBatches } = await runBatchUploads(toUpload, uploadFn, batchSize, maxConcurrent);
1015
+ if (this.#editor) {
1016
+ const lazyLoad = this.option()?.imageConfig?.lazyLoad ?? true;
1017
+ for (const detail of replacements.values()) {
1018
+ plugin.setMeta(detail.cdn, { name: detail.name, idOrKey: detail.idOrKey, lazyLoad });
1019
+ }
1020
+ applyReplacementsToEditor(this.#editor, replacements);
1021
+ }
1022
+ // Chỉ xóa đúng các entries đã được xử lý
1023
+ for (const blobUrl of processedBlobUrls) {
1024
+ plugin.pendingFiles.delete(blobUrl);
1025
+ }
1026
+ for (const [blobUrl, file] of failedBatches.flat()) {
1027
+ plugin.pendingFiles.set(blobUrl, file);
1028
+ }
1029
+ if (failedBatches.length > 0) {
1030
+ throw new Error(`Upload failed for ${failedBatches.flat().length} image(s)`);
1031
+ }
1032
+ };
1033
+ #getConfigurations = () => {
1034
+ const config = this.#uploadConfig;
1035
+ if (!config) {
1036
+ return [];
1037
+ }
1038
+ return Array.isArray(config) ? config : [config];
1039
+ };
1040
+ #validateDuplicateConfigKeys = () => {
1041
+ const config = this.#uploadConfig;
1042
+ if (!config) {
1043
+ return;
1044
+ }
1045
+ const configurations = Array.isArray(config) ? config : [config];
1046
+ const seen = new Set();
1047
+ for (const cfg of configurations) {
1048
+ const normalizedKey = cfg.key === undefined ? '__undefined__' : cfg.key;
1049
+ if (seen.has(normalizedKey)) {
1050
+ const label = cfg.key === undefined ? 'undefined' : cfg.key;
1051
+ throw new Error(`[sd-editor] Duplicate upload configuration key detected: ${label}`);
1052
+ }
1053
+ seen.add(normalizedKey);
1054
+ }
1055
+ };
1056
+ #getSelectedConfig = () => {
1057
+ const configurations = this.#getConfigurations();
1058
+ if (!configurations.length) {
1059
+ return undefined;
1060
+ }
1061
+ return configurations.find(cfg => cfg.key === this.key());
1062
+ };
1063
+ #buildUploadFn = () => {
1064
+ return this.option()?.imageConfig?.uploadFn ?? this.#getSelectedConfig()?.upload;
1065
+ };
1066
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
1067
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdEditor, isStandalone: true, selector: "sd-editor", inputs: { option: { classPropertyName: "option", publicName: "option", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, helperText: { classPropertyName: "helperText", publicName: "helperText", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, hideInlineError: { classPropertyName: "hideInlineError", publicName: "hideInlineError", isSignal: true, isRequired: false, transformFunction: null }, inlineError: { classPropertyName: "inlineError", publicName: "inlineError", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, validator: { classPropertyName: "validator", publicName: "validator", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: false, transformFunction: null }, autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange", sdChange: "sdChange", sdBlur: "sdBlur", sdFocus: "sdFocus" }, ngImport: i0, template: "<sd-ckeditor-styles />\n@let lbl = label();\n@let hText = helperText();\n@let hideErr = hideInlineError();\n@let errMsg = errorMessage;\n@let req = required();\n@let maxLen = maxlength();\n@let showCounter = !!maxLen && !formControl.disabled && !hideErr;\n\n@if (lbl) {\n <sd-label [label]=\"lbl\" [required]=\"req\" [helperText]=\"hText\"></sd-label>\n}\n\n<div\n class=\"sd-editor\"\n [class.sd-editor--readonly]=\"readonly()\"\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\n [class.has-counter]=\"showCounter\"\n [style.--sd-editor-content-min-height]=\"height()\"\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-empty]=\"dataEmpty()\">\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\n\n @if (showCounter) {\n <div class=\"sd-editor-counter-row\">\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ maxLen }} </span>\n </div>\n }\n\n @if (hideErr && errMsg && formControl.touched) {\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\">error</mat-icon>\n }\n</div>\n\n<div class=\"sd-editor-footer\">\n @if (!hideErr && errMsg && formControl.touched) {\n <mat-error>{{ errMsg }}</mat-error>\n }\n</div>\n", styles: [".sd-editor{display:flex;flex-direction:column;width:100%;position:relative}.sd-editor-counter-row{display:flex;justify-content:flex-end;align-items:center;padding:4px 12px;border:1px solid var(--ck-color-base-border);border-top:none}.sd-editor-footer{min-height:20px;margin-top:4px}.sd-editor-footer mat-error{font-size:12px;color:var(--mdc-theme-error, #f44336)}.sd-error-icon{position:absolute;right:8px;bottom:8px;z-index:2;color:var(--mdc-theme-error, #f44336);height:20px;width:20px;font-size:20px;cursor:default}.sd-editor--readonly :host ::ng-deep .ck-editor__editable{background:#0000000a;cursor:default}.sd-editor-counter{font-size:12px;color:#0009}.sd-editor-counter--over{color:var(--mdc-theme-error, #f44336)}::ng-deep .ck-powered-by,::ng-deep .ck-powered-by-balloon{display:none!important}:host ::ng-deep ckeditor,:host ::ng-deep .ck-editor{display:flex;flex-direction:column}:host ::ng-deep .ck-editor{--ck-content-font-size: 14px;--ck-content-line-height: 1.5}:host ::ng-deep .ck-editor__main{overflow:visible}:host ::ng-deep .ck-editor__editable{min-height:var(--sd-editor-content-min-height, 200px)!important;max-height:var(--sd-editor-content-max-height, none)!important;padding:24px!important;overflow-y:auto!important;border:1px solid var(--ck-color-base-border)!important}:host ::ng-deep .ck-editor__editable.ck-focused{box-shadow:none!important}:host ::ng-deep .sd-editor.has-counter .ck-editor__editable{border-bottom:none!important}:host ::ng-deep .sd-editor--error .ck-editor__editable,:host ::ng-deep .sd-editor--error .ck-toolbar{border-color:var(--mdc-theme-error, #f44336)!important}:host ::ng-deep .sd-editor--error.has-counter .sd-editor-counter-row{border-color:var(--mdc-theme-error, #f44336)}:host ::ng-deep .ck-content p{margin-bottom:var(--ck-spacing-large);text-indent:0}:host ::ng-deep .ck-content ul,:host ::ng-deep .ck-content ol{margin-left:0!important;padding-left:20px!important}\n", ":host ::ng-deep .ck-content img{max-width:100%!important;height:auto!important;object-fit:contain}:host ::ng-deep .ck-content figure.image{position:relative;display:block;width:fit-content;max-width:100%;margin:0 auto;overflow:visible}:host ::ng-deep .ck-content figure.image:hover{z-index:99999!important}:host ::ng-deep .ck-content figure.image.image-style-align-left{float:left;margin:0 1em 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-left[style*=\"width:100\"]{float:none;margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-right{float:right;margin:0 0 0 1em}:host ::ng-deep .ck-content figure.image.image-style-align-right[style*=\"width:100\"]{float:none;margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image.image-style-block-align-left{margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-block-align-right{margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image .ck-progress-bar{position:absolute;bottom:0;left:0;width:30%!important;height:3px;background:var(--sd-color-primary, #1565c0);border-radius:2px;z-index:10;pointer-events:none;animation:sd-progress-indeterminate 1.4s ease-in-out infinite}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar){overflow:hidden}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar) img{filter:blur(1px) brightness(.85);transition:filter .3s ease}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):after{content:\"\";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:9;background:#ffffff40;border-radius:inherit}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):before{content:\"\";position:absolute;top:50%;left:50%;width:28px;height:28px;margin:-14px 0 0 -14px;border:3px solid rgba(255,255,255,.5);border-top-color:var(--sd-color-primary, #1565c0);border-radius:50%;animation:sd-spinner .75s linear infinite;z-index:11;pointer-events:none}@keyframes sd-spinner{to{transform:rotate(360deg)}}@keyframes sd-progress-indeterminate{0%{left:-30%}to{left:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CKEditorModule }, { kind: "component", type: i1.CKEditorComponent, selector: "ckeditor", inputs: ["editor", "config", "data", "tagName", "watchdog", "editorWatchdogConfig", "disableWatchdog", "disableTwoWayDataBinding", "disabled"], outputs: ["ready", "change", "blur", "focus", "error"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "component", type: SdCKEditorStyles, selector: "sd-ckeditor-styles" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1068
+ }
1069
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdEditor, decorators: [{
1070
+ type: Component,
1071
+ args: [{ selector: 'sd-editor', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CKEditorModule, SdLabel, SdCKEditorStyles, MatFormFieldModule, MatIconModule, MatTooltipModule], template: "<sd-ckeditor-styles />\n@let lbl = label();\n@let hText = helperText();\n@let hideErr = hideInlineError();\n@let errMsg = errorMessage;\n@let req = required();\n@let maxLen = maxlength();\n@let showCounter = !!maxLen && !formControl.disabled && !hideErr;\n\n@if (lbl) {\n <sd-label [label]=\"lbl\" [required]=\"req\" [helperText]=\"hText\"></sd-label>\n}\n\n<div\n class=\"sd-editor\"\n [class.sd-editor--readonly]=\"readonly()\"\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\n [class.has-counter]=\"showCounter\"\n [style.--sd-editor-content-min-height]=\"height()\"\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-empty]=\"dataEmpty()\">\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\n\n @if (showCounter) {\n <div class=\"sd-editor-counter-row\">\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ maxLen }} </span>\n </div>\n }\n\n @if (hideErr && errMsg && formControl.touched) {\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\">error</mat-icon>\n }\n</div>\n\n<div class=\"sd-editor-footer\">\n @if (!hideErr && errMsg && formControl.touched) {\n <mat-error>{{ errMsg }}</mat-error>\n }\n</div>\n", styles: [".sd-editor{display:flex;flex-direction:column;width:100%;position:relative}.sd-editor-counter-row{display:flex;justify-content:flex-end;align-items:center;padding:4px 12px;border:1px solid var(--ck-color-base-border);border-top:none}.sd-editor-footer{min-height:20px;margin-top:4px}.sd-editor-footer mat-error{font-size:12px;color:var(--mdc-theme-error, #f44336)}.sd-error-icon{position:absolute;right:8px;bottom:8px;z-index:2;color:var(--mdc-theme-error, #f44336);height:20px;width:20px;font-size:20px;cursor:default}.sd-editor--readonly :host ::ng-deep .ck-editor__editable{background:#0000000a;cursor:default}.sd-editor-counter{font-size:12px;color:#0009}.sd-editor-counter--over{color:var(--mdc-theme-error, #f44336)}::ng-deep .ck-powered-by,::ng-deep .ck-powered-by-balloon{display:none!important}:host ::ng-deep ckeditor,:host ::ng-deep .ck-editor{display:flex;flex-direction:column}:host ::ng-deep .ck-editor{--ck-content-font-size: 14px;--ck-content-line-height: 1.5}:host ::ng-deep .ck-editor__main{overflow:visible}:host ::ng-deep .ck-editor__editable{min-height:var(--sd-editor-content-min-height, 200px)!important;max-height:var(--sd-editor-content-max-height, none)!important;padding:24px!important;overflow-y:auto!important;border:1px solid var(--ck-color-base-border)!important}:host ::ng-deep .ck-editor__editable.ck-focused{box-shadow:none!important}:host ::ng-deep .sd-editor.has-counter .ck-editor__editable{border-bottom:none!important}:host ::ng-deep .sd-editor--error .ck-editor__editable,:host ::ng-deep .sd-editor--error .ck-toolbar{border-color:var(--mdc-theme-error, #f44336)!important}:host ::ng-deep .sd-editor--error.has-counter .sd-editor-counter-row{border-color:var(--mdc-theme-error, #f44336)}:host ::ng-deep .ck-content p{margin-bottom:var(--ck-spacing-large);text-indent:0}:host ::ng-deep .ck-content ul,:host ::ng-deep .ck-content ol{margin-left:0!important;padding-left:20px!important}\n", ":host ::ng-deep .ck-content img{max-width:100%!important;height:auto!important;object-fit:contain}:host ::ng-deep .ck-content figure.image{position:relative;display:block;width:fit-content;max-width:100%;margin:0 auto;overflow:visible}:host ::ng-deep .ck-content figure.image:hover{z-index:99999!important}:host ::ng-deep .ck-content figure.image.image-style-align-left{float:left;margin:0 1em 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-left[style*=\"width:100\"]{float:none;margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-right{float:right;margin:0 0 0 1em}:host ::ng-deep .ck-content figure.image.image-style-align-right[style*=\"width:100\"]{float:none;margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image.image-style-block-align-left{margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-block-align-right{margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image .ck-progress-bar{position:absolute;bottom:0;left:0;width:30%!important;height:3px;background:var(--sd-color-primary, #1565c0);border-radius:2px;z-index:10;pointer-events:none;animation:sd-progress-indeterminate 1.4s ease-in-out infinite}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar){overflow:hidden}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar) img{filter:blur(1px) brightness(.85);transition:filter .3s ease}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):after{content:\"\";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:9;background:#ffffff40;border-radius:inherit}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):before{content:\"\";position:absolute;top:50%;left:50%;width:28px;height:28px;margin:-14px 0 0 -14px;border:3px solid rgba(255,255,255,.5);border-top-color:var(--sd-color-primary, #1565c0);border-radius:50%;animation:sd-spinner .75s linear infinite;z-index:11;pointer-events:none}@keyframes sd-spinner{to{transform:rotate(360deg)}}@keyframes sd-progress-indeterminate{0%{left:-30%}to{left:100%}}\n"] }]
1072
+ }], ctorParameters: () => [] });
1073
+
1074
+ /**
1075
+ * Generated bundle index. Do not edit.
1076
+ */
1077
+
1078
+ export { SD_EDITOR_CONFIGURATION, SdEditor };
1079
+ //# sourceMappingURL=sdcorejs-angular-components-editor.mjs.map