@sdcorejs/angular 19.0.9 → 19.0.11

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 (257) hide show
  1. package/README.md +270 -140
  2. package/assets/STYLE-GUIDE.md +2 -2
  3. package/assets/scss/core/_inline-edit.scss +1 -1
  4. package/assets/scss/core/form.scss +1 -1
  5. package/assets/scss/core/utilities/_grid.scss +25 -19
  6. package/assets/scss/themes/default.scss +2 -2
  7. package/components/anchor/src/models/sd-anchor.model.d.ts +1 -1
  8. package/components/badge/src/badge.component.d.ts +3 -14
  9. package/components/button/src/button.component.d.ts +5 -3
  10. package/components/document-builder/src/document-builder.component.d.ts +2 -2
  11. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +1 -1
  12. package/components/editor/src/plugins/image-upload/utils/batch.utils.d.ts +3 -3
  13. package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +10 -6
  14. package/components/form-generic/src/components/form-builder/components/attribute-expression/form-expression-query-adapter.d.ts +6 -0
  15. package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +2 -2
  16. package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +2 -2
  17. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +2 -2
  18. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +2 -2
  19. package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +2 -4
  20. package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +2 -4
  21. package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +2 -2
  22. package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +2 -2
  23. package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +2 -2
  24. package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +2 -2
  25. package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +2 -2
  26. package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +6 -7
  27. package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +2 -2
  28. package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +2 -2
  29. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +2 -2
  30. package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +2 -2
  31. package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +2 -2
  32. package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +2 -2
  33. package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +2 -2
  34. package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +2 -2
  35. package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +2 -2
  36. package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +2 -2
  37. package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +2 -2
  38. package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +2 -2
  39. package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +2 -2
  40. package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +2 -2
  41. package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +2 -2
  42. package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +2 -2
  43. package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +2 -2
  44. package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +2 -2
  45. package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +2 -2
  46. package/components/form-generic/src/components/form-builder/form-builder-layout.d.ts +22 -0
  47. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +24 -5
  48. package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +2 -2
  49. package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +2 -2
  50. package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +2 -2
  51. package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +2 -2
  52. package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +2 -2
  53. package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +2 -2
  54. package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +2 -2
  55. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +2 -2
  56. package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +2 -2
  57. package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +2 -2
  58. package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +2 -2
  59. package/components/form-generic/src/components/form-render/components/variable/variable.component.d.ts +2 -2
  60. package/components/form-generic/src/components/form-render/form-render.component.d.ts +4 -6
  61. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +2 -2
  62. package/components/form-generic/src/configurations/form.configuration.d.ts +1 -1
  63. package/components/form-generic/src/models/form-generic-component.model.d.ts +2 -2
  64. package/components/form-generic/src/services/form-generic.service.d.ts +1 -3
  65. package/components/import-excel/src/import-excel.model.d.ts +2 -2
  66. package/components/inform/src/inform.component.d.ts +2 -8
  67. package/components/mini-editor/src/mini-editor.component.d.ts +4 -4
  68. package/components/modal/src/modal.component.d.ts +1 -1
  69. package/components/query-builder/src/query-builder.component.d.ts +3 -3
  70. package/components/query-builder/src/query-builder.model.d.ts +4 -4
  71. package/components/splitter/src/splitter-state.service.d.ts +1 -1
  72. package/components/tab-router/src/models/tab-router.model.d.ts +2 -1
  73. package/components/tab-router/src/services/tab-router.service.d.ts +0 -1
  74. package/components/table/src/components/command/desktop-command.component.d.ts +7 -7
  75. package/components/table/src/components/command/pipes/command.pipe.d.ts +1 -12
  76. package/components/table/src/components/command/pipes/filter.pipe.d.ts +1 -8
  77. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +1 -0
  78. package/components/table/src/models/table-column.model.d.ts +3 -2
  79. package/components/table/src/models/table-command.model.d.ts +3 -3
  80. package/components/table/src/models/table-option-selector.model.d.ts +5 -5
  81. package/components/table/src/pipes/selection-disabled.pipe.d.ts +1 -1
  82. package/components/table/src/services/config.service.d.ts +4 -5
  83. package/components/tree/src/tree.model.d.ts +3 -2
  84. package/components/view/src/view.component.d.ts +1 -1
  85. package/configurations/src/sd-core.configuration.d.ts +2 -2
  86. package/fesm2022/sdcorejs-angular-components-anchor.mjs +20 -24
  87. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +4 -5
  89. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-components-avatar.mjs.map +1 -1
  91. package/fesm2022/sdcorejs-angular-components-badge.mjs +14 -13
  92. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  93. package/fesm2022/sdcorejs-angular-components-button.mjs +15 -17
  94. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  95. package/fesm2022/sdcorejs-angular-components-chart.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  97. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +5 -6
  98. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  99. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +17 -26
  100. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  101. package/fesm2022/sdcorejs-angular-components-editor.mjs +11 -7
  102. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  103. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +715 -436
  104. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  105. package/fesm2022/sdcorejs-angular-components-history.mjs +2 -2
  106. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  107. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +38 -23
  108. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  109. package/fesm2022/sdcorejs-angular-components-inform.mjs +5 -16
  110. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +5 -6
  113. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-components-modal.mjs +28 -18
  115. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-components-operator.mjs +1 -1
  117. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +4 -5
  119. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-components-preview.mjs +40 -37
  121. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +38 -55
  123. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +5 -7
  125. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-components-quick-action.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-components-section.mjs +3 -5
  128. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +6 -7
  130. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  131. package/fesm2022/sdcorejs-angular-components-splitter.mjs +4 -4
  132. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  133. package/fesm2022/sdcorejs-angular-components-stepper.mjs +3 -4
  134. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  135. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +36 -37
  136. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  137. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -4
  138. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-components-table.mjs +79 -101
  140. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-components-tree.mjs +6 -8
  142. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +14 -15
  144. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-components-view.mjs +3 -9
  146. package/fesm2022/sdcorejs-angular-components-view.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  148. package/fesm2022/sdcorejs-angular-directives.mjs +2 -7
  149. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  150. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +5 -10
  151. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  152. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +9 -11
  154. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-forms-chip.mjs +7 -9
  156. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +8 -12
  158. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-forms-date.mjs +8 -12
  160. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +7 -13
  162. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-forms-inline-text.mjs +4 -5
  164. package/fesm2022/sdcorejs-angular-forms-inline-text.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +3 -3
  166. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +6 -8
  168. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-forms-input.mjs +5 -7
  170. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-forms-label.mjs +4 -6
  172. package/fesm2022/sdcorejs-angular-forms-label.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  174. package/fesm2022/sdcorejs-angular-forms-radio.mjs +12 -4
  175. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  176. package/fesm2022/sdcorejs-angular-forms-select.mjs +51 -22
  177. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  178. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  179. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +7 -9
  180. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  181. package/fesm2022/sdcorejs-angular-handlers.mjs +3 -6
  182. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-i18n.mjs +11 -7
  184. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-interceptors.mjs +0 -2
  186. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-modules-auth.mjs +14 -38
  188. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-modules-authom.mjs +14 -14
  190. package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-modules-icon.mjs +523 -0
  192. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -0
  193. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +22 -11
  194. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  195. package/fesm2022/sdcorejs-angular-modules-layout.mjs +53 -52
  196. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  197. package/fesm2022/sdcorejs-angular-modules-permission.mjs +5 -12
  198. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  199. package/fesm2022/sdcorejs-angular-modules.mjs +1 -0
  200. package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
  201. package/fesm2022/sdcorejs-angular-pipes.mjs +71 -17
  202. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  203. package/fesm2022/sdcorejs-angular-services-api.mjs +0 -2
  204. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  205. package/fesm2022/sdcorejs-angular-services-cache.mjs +5 -11
  206. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  207. package/fesm2022/sdcorejs-angular-services-confirm.mjs +19 -25
  208. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  209. package/fesm2022/sdcorejs-angular-services-docx.mjs +2 -8
  210. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  211. package/fesm2022/sdcorejs-angular-services-excel.mjs +24 -16
  212. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  213. package/fesm2022/sdcorejs-angular-services-license.mjs +5 -12
  214. package/fesm2022/sdcorejs-angular-services-license.mjs.map +1 -1
  215. package/fesm2022/sdcorejs-angular-services-notify.mjs +70 -87
  216. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  217. package/fesm2022/sdcorejs-angular-services-storage.mjs +6 -15
  218. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  219. package/fesm2022/sdcorejs-angular-utilities-data-state.mjs.map +1 -1
  220. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +47 -5
  221. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  222. package/fesm2022/sdcorejs-angular-utilities-models.mjs +21 -5
  223. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  224. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  225. package/forms/chip/src/chip.component.d.ts +2 -2
  226. package/forms/chip-calendar/src/chip-calendar.component.d.ts +2 -2
  227. package/forms/input-color/src/input-color.component.d.ts +2 -1
  228. package/forms/select/src/select-footer-action.directive.d.ts +5 -1
  229. package/forms/select/src/select.component.d.ts +4 -0
  230. package/modules/auth/guards/auth.guard.d.ts +2 -4
  231. package/modules/auth/guards/portal.guard.d.ts +2 -4
  232. package/modules/auth/services/auth.service.d.ts +3 -4
  233. package/modules/icon/index.d.ts +1 -0
  234. package/modules/icon/src/icon.component.d.ts +101 -0
  235. package/modules/icon/src/icon.model.d.ts +59 -0
  236. package/modules/icon/src/icon.provider.d.ts +33 -0
  237. package/modules/icon/src/index.d.ts +3 -0
  238. package/modules/index.d.ts +1 -0
  239. package/modules/layout/modules/home/guards/home-redirect.guard.d.ts +3 -5
  240. package/modules/permission/src/configurations/permission.configuration.d.ts +3 -3
  241. package/modules/permission/src/guards/permission.guard.d.ts +2 -5
  242. package/package.json +11 -6
  243. package/pipes/index.d.ts +3 -0
  244. package/pipes/src/format-date.pipe.d.ts +8 -0
  245. package/pipes/src/format-datetime.pipe.d.ts +8 -0
  246. package/pipes/src/format-number.pipe.d.ts +1 -3
  247. package/pipes/src/view.pipe.d.ts +7 -0
  248. package/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.d.ts +3 -3
  249. package/services/excel/src/lib/spreadsheet-formula-injection.util.d.ts +5 -0
  250. package/services/license/src/license.service.d.ts +2 -3
  251. package/services/notify/src/components/toast/toast.component.d.ts +9 -13
  252. package/services/notify/src/notify.service.d.ts +4 -5
  253. package/services/storage/src/storage.service.d.ts +3 -4
  254. package/utilities/extensions/index.d.ts +1 -0
  255. package/utilities/extensions/src/object.extension.d.ts +8 -0
  256. package/utilities/models/src/icon.model.d.ts +4 -2
  257. package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +0 -24
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-chart.mjs","sources":["../../../projects/sdcorejs-angular/components/chart/src/bar-chart.component.ts","../../../projects/sdcorejs-angular/components/chart/src/line-chart.component.ts","../../../projects/sdcorejs-angular/components/chart/src/pie-chart.component.ts","../../../projects/sdcorejs-angular/components/chart/src/doughnut-chart.component.ts","../../../projects/sdcorejs-angular/components/chart/sdcorejs-angular-components-chart.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ElementRef, InputSignal, OnDestroy, OnInit, effect, input, computed, viewChild } from '@angular/core';\nimport { Chart, ChartData, ChartOptions, Plugin, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sd-bar-chart',\n template: `\n <div [style.overflow-x]=\"isScrollable() ? 'auto' : 'visible'\" style=\"width: 100%; height: 100%;\">\n <div [style.height]=\"'100%'\" [style.min-width.px]=\"computedMinWidth()\" style=\"position: relative;\">\n <canvas #canvas></canvas>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SdBarChartComponent implements OnInit, OnDestroy {\n canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n data: InputSignal<ChartData<'bar'>> = input.required<ChartData<'bar'>>();\n options: InputSignal<ChartOptions<'bar'> | undefined> = input<ChartOptions<'bar'>>();\n plugins: InputSignal<Plugin<'bar'>[]> = input<Plugin<'bar'>[]>([]);\n\n isScrollable = computed(() => {\n const labelsLength = this.data()?.labels?.length || 0;\n return labelsLength > 15;\n });\n\n computedMinWidth = computed(() => {\n if (!this.isScrollable()) return null;\n const labelsLength = this.data()?.labels?.length || 0;\n return labelsLength * 50;\n });\n\n chart: Chart<'bar'> | undefined;\n\n constructor() {\n effect(() => {\n const currentData = this.data();\n const currentOptions = this.options();\n \n if (this.chart) {\n this.chart.data = currentData as any;\n if (currentOptions) {\n this.chart.options = currentOptions;\n }\n this.chart.update();\n }\n });\n }\n\n ngOnInit() {\n this.#initChart();\n }\n\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n #initChart() {\n if (this.chart) {\n this.chart.destroy();\n }\n const ctx = this.canvas().nativeElement.getContext('2d');\n if (ctx) {\n this.chart = new Chart(ctx, {\n type: 'bar',\n data: this.data() as any,\n options: this.options() || {},\n plugins: this.plugins(),\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, InputSignal, OnDestroy, OnInit, effect, input, computed, viewChild } from '@angular/core';\nimport { Chart, ChartData, ChartOptions, Plugin, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sd-line-chart',\n template: `\n <div [style.overflow-x]=\"isScrollable() ? 'auto' : 'visible'\" style=\"width: 100%; height: 100%;\">\n <div [style.height]=\"'100%'\" [style.min-width.px]=\"computedMinWidth()\" style=\"position: relative;\">\n <canvas #canvas></canvas>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SdLineChartComponent implements OnInit, OnDestroy {\n canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n data: InputSignal<ChartData<'line'>> = input.required<ChartData<'line'>>();\n options: InputSignal<ChartOptions<'line'> | undefined> = input<ChartOptions<'line'>>();\n plugins: InputSignal<Plugin<'line'>[]> = input<Plugin<'line'>[]>([]);\n\n isScrollable = computed(() => {\n const labelsLength = this.data()?.labels?.length || 0;\n return labelsLength > 15;\n });\n\n computedMinWidth = computed(() => {\n if (!this.isScrollable()) return null;\n const labelsLength = this.data()?.labels?.length || 0;\n return labelsLength * 50;\n });\n\n chart: Chart<'line'> | undefined;\n\n constructor() {\n effect(() => {\n const currentData = this.data();\n const currentOptions = this.options();\n \n if (this.chart) {\n this.chart.data = currentData;\n if (currentOptions) {\n this.chart.options = currentOptions;\n }\n this.chart.update();\n }\n });\n }\n\n ngOnInit() {\n this.#initChart();\n }\n\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n #initChart() {\n if (this.chart) {\n this.chart.destroy();\n }\n const ctx = this.canvas().nativeElement.getContext('2d');\n if (ctx) {\n this.chart = new Chart(ctx, {\n type: 'line',\n data: this.data(),\n options: this.options() || {},\n plugins: this.plugins(),\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, InputSignal, OnDestroy, OnInit, effect, input, viewChild } from '@angular/core';\nimport { Chart, ChartData, ChartOptions, Plugin, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sd-pie-chart',\n template: `\n <div style=\"position: relative; height: 100%; width: 100%;\">\n <canvas #canvas></canvas>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SdPieChartComponent implements OnInit, OnDestroy {\n canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n data: InputSignal<ChartData<'pie'>> = input.required<ChartData<'pie'>>();\n options: InputSignal<ChartOptions<'pie'> | undefined> = input<ChartOptions<'pie'>>();\n plugins: InputSignal<Plugin<'pie'>[]> = input<Plugin<'pie'>[]>([]);\n\n chart: Chart<'pie'> | undefined;\n\n constructor() {\n effect(() => {\n const currentData = this.data();\n const currentOptions = this.options();\n \n if (this.chart) {\n this.chart.data = currentData;\n if (currentOptions) {\n this.chart.options = currentOptions;\n }\n this.chart.update();\n }\n });\n }\n\n ngOnInit() {\n this.#initChart();\n }\n\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n #initChart() {\n if (this.chart) {\n this.chart.destroy();\n }\n const ctx = this.canvas().nativeElement.getContext('2d');\n if (ctx) {\n this.chart = new Chart(ctx, {\n type: 'pie',\n data: this.data(),\n options: this.options() || {},\n plugins: this.plugins(),\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, InputSignal, OnDestroy, OnInit, effect, input, viewChild } from '@angular/core';\nimport { Chart, ChartData, ChartOptions, Plugin, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sd-doughnut-chart',\n template: `\n <div style=\"position: relative; height: 100%; width: 100%;\">\n <canvas #canvas></canvas>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SdDoughnutChartComponent implements OnInit, OnDestroy {\n canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n data: InputSignal<ChartData<'doughnut'>> = input.required<ChartData<'doughnut'>>();\n options: InputSignal<ChartOptions<'doughnut'> | undefined> = input<ChartOptions<'doughnut'>>();\n plugins: InputSignal<Plugin<'doughnut'>[]> = input<Plugin<'doughnut'>[]>([]);\n\n chart: Chart<'doughnut'> | undefined;\n\n constructor() {\n effect(() => {\n const currentData = this.data();\n const currentOptions = this.options();\n \n if (this.chart) {\n this.chart.data = currentData;\n if (currentOptions) {\n this.chart.options = currentOptions;\n }\n this.chart.update();\n }\n });\n }\n\n ngOnInit() {\n this.#initChart();\n }\n\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n #initChart() {\n if (this.chart) {\n this.chart.destroy();\n }\n const ctx = this.canvas().nativeElement.getContext('2d');\n if (ctx) {\n this.chart = new Chart(ctx, {\n type: 'doughnut',\n data: this.data(),\n options: this.options() || {},\n plugins: this.plugins(),\n });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-components-chart.mjs","sources":["../../../projects/sdcorejs-angular/components/chart/src/bar-chart.component.ts","../../../projects/sdcorejs-angular/components/chart/src/line-chart.component.ts","../../../projects/sdcorejs-angular/components/chart/src/pie-chart.component.ts","../../../projects/sdcorejs-angular/components/chart/src/doughnut-chart.component.ts","../../../projects/sdcorejs-angular/components/chart/sdcorejs-angular-components-chart.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n OnDestroy,\n OnInit,\n effect,\n input,\n computed,\n viewChild,\n} from '@angular/core';\nimport { Chart, ChartData, ChartOptions, Plugin, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sd-bar-chart',\n template: `\n <div [style.overflow-x]=\"isScrollable() ? 'auto' : 'visible'\" style=\"width: 100%; height: 100%;\">\n <div [style.height]=\"'100%'\" [style.min-width.px]=\"computedMinWidth()\" style=\"position: relative;\">\n <canvas #canvas></canvas>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SdBarChartComponent implements OnInit, OnDestroy {\n canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n data: InputSignal<ChartData<'bar'>> = input.required<ChartData<'bar'>>();\n options: InputSignal<ChartOptions<'bar'> | undefined> = input<ChartOptions<'bar'>>();\n plugins: InputSignal<Plugin<'bar'>[]> = input<Plugin<'bar'>[]>([]);\n\n isScrollable = computed(() => {\n const labelsLength = this.data()?.labels?.length || 0;\n return labelsLength > 15;\n });\n\n computedMinWidth = computed(() => {\n if (!this.isScrollable()) return null;\n const labelsLength = this.data()?.labels?.length || 0;\n return labelsLength * 50;\n });\n\n chart: Chart<'bar'> | undefined;\n\n constructor() {\n effect(() => {\n const currentData = this.data();\n const currentOptions = this.options();\n\n if (this.chart) {\n this.chart.data = currentData as any;\n if (currentOptions) {\n this.chart.options = currentOptions;\n }\n this.chart.update();\n }\n });\n }\n\n ngOnInit() {\n this.#initChart();\n }\n\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n #initChart() {\n if (this.chart) {\n this.chart.destroy();\n }\n const ctx = this.canvas().nativeElement.getContext('2d');\n if (ctx) {\n this.chart = new Chart(ctx, {\n type: 'bar',\n data: this.data() as any,\n options: this.options() || {},\n plugins: this.plugins(),\n });\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n OnDestroy,\n OnInit,\n effect,\n input,\n computed,\n viewChild,\n} from '@angular/core';\nimport { Chart, ChartData, ChartOptions, Plugin, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sd-line-chart',\n template: `\n <div [style.overflow-x]=\"isScrollable() ? 'auto' : 'visible'\" style=\"width: 100%; height: 100%;\">\n <div [style.height]=\"'100%'\" [style.min-width.px]=\"computedMinWidth()\" style=\"position: relative;\">\n <canvas #canvas></canvas>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SdLineChartComponent implements OnInit, OnDestroy {\n canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n data: InputSignal<ChartData<'line'>> = input.required<ChartData<'line'>>();\n options: InputSignal<ChartOptions<'line'> | undefined> = input<ChartOptions<'line'>>();\n plugins: InputSignal<Plugin<'line'>[]> = input<Plugin<'line'>[]>([]);\n\n isScrollable = computed(() => {\n const labelsLength = this.data()?.labels?.length || 0;\n return labelsLength > 15;\n });\n\n computedMinWidth = computed(() => {\n if (!this.isScrollable()) return null;\n const labelsLength = this.data()?.labels?.length || 0;\n return labelsLength * 50;\n });\n\n chart: Chart<'line'> | undefined;\n\n constructor() {\n effect(() => {\n const currentData = this.data();\n const currentOptions = this.options();\n\n if (this.chart) {\n this.chart.data = currentData;\n if (currentOptions) {\n this.chart.options = currentOptions;\n }\n this.chart.update();\n }\n });\n }\n\n ngOnInit() {\n this.#initChart();\n }\n\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n #initChart() {\n if (this.chart) {\n this.chart.destroy();\n }\n const ctx = this.canvas().nativeElement.getContext('2d');\n if (ctx) {\n this.chart = new Chart(ctx, {\n type: 'line',\n data: this.data(),\n options: this.options() || {},\n plugins: this.plugins(),\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, InputSignal, OnDestroy, OnInit, effect, input, viewChild } from '@angular/core';\nimport { Chart, ChartData, ChartOptions, Plugin, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sd-pie-chart',\n template: `\n <div style=\"position: relative; height: 100%; width: 100%;\">\n <canvas #canvas></canvas>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SdPieChartComponent implements OnInit, OnDestroy {\n canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n data: InputSignal<ChartData<'pie'>> = input.required<ChartData<'pie'>>();\n options: InputSignal<ChartOptions<'pie'> | undefined> = input<ChartOptions<'pie'>>();\n plugins: InputSignal<Plugin<'pie'>[]> = input<Plugin<'pie'>[]>([]);\n\n chart: Chart<'pie'> | undefined;\n\n constructor() {\n effect(() => {\n const currentData = this.data();\n const currentOptions = this.options();\n\n if (this.chart) {\n this.chart.data = currentData;\n if (currentOptions) {\n this.chart.options = currentOptions;\n }\n this.chart.update();\n }\n });\n }\n\n ngOnInit() {\n this.#initChart();\n }\n\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n #initChart() {\n if (this.chart) {\n this.chart.destroy();\n }\n const ctx = this.canvas().nativeElement.getContext('2d');\n if (ctx) {\n this.chart = new Chart(ctx, {\n type: 'pie',\n data: this.data(),\n options: this.options() || {},\n plugins: this.plugins(),\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, InputSignal, OnDestroy, OnInit, effect, input, viewChild } from '@angular/core';\nimport { Chart, ChartData, ChartOptions, Plugin, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sd-doughnut-chart',\n template: `\n <div style=\"position: relative; height: 100%; width: 100%;\">\n <canvas #canvas></canvas>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SdDoughnutChartComponent implements OnInit, OnDestroy {\n canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n data: InputSignal<ChartData<'doughnut'>> = input.required<ChartData<'doughnut'>>();\n options: InputSignal<ChartOptions<'doughnut'> | undefined> = input<ChartOptions<'doughnut'>>();\n plugins: InputSignal<Plugin<'doughnut'>[]> = input<Plugin<'doughnut'>[]>([]);\n\n chart: Chart<'doughnut'> | undefined;\n\n constructor() {\n effect(() => {\n const currentData = this.data();\n const currentOptions = this.options();\n\n if (this.chart) {\n this.chart.data = currentData;\n if (currentOptions) {\n this.chart.options = currentOptions;\n }\n this.chart.update();\n }\n });\n }\n\n ngOnInit() {\n this.#initChart();\n }\n\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n #initChart() {\n if (this.chart) {\n this.chart.destroy();\n }\n const ctx = this.canvas().nativeElement.getContext('2d');\n if (ctx) {\n this.chart = new Chart(ctx, {\n type: 'doughnut',\n data: this.data(),\n options: this.options() || {},\n plugins: this.plugins(),\n });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-ckeditor-styles.mjs","sources":["../../../projects/sdcorejs-angular/components/ckeditor-styles/src/ckeditor-styles.component.ts","../../../projects/sdcorejs-angular/components/ckeditor-styles/sdcorejs-angular-components-ckeditor-styles.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * Styles-only component that loads the global CKEditor 5 stylesheet on demand.\n *\n * Why this exists:\n * - CKEditor's CSS must be global (applies to body-rendered overlays, dialogs, balloons),\n * which means whichever Angular component declares it must use ViewEncapsulation.None.\n * - Switching encapsulation on the main editor components (`<sd-editor>`, `<sd-mini-editor>`,\n * `<sd-document-builder>`) would un-scope all their local styles too.\n * - Instead, this tiny no-render component owns the global CSS. The editor components embed\n * `<sd-ckeditor-styles>` at the top of their template; the CSS is injected once into <head>\n * the first time any editor instance mounts. Editor components themselves keep\n * ViewEncapsulation.Emulated.\n *\n * Behavior:\n * - Renders nothing in the DOM (empty template).\n * - Angular dedupes styles per component class — multiple instances inject the <style> tag\n * only once.\n * - When the host editor component is lazy-loaded, this component's chunk and its CSS travel\n * with it.\n */\n@Component({\n selector: 'sd-ckeditor-styles',\n standalone: true,\n template: '',\n styleUrls: ['../../../assets/scss/ckeditor5.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdCKEditorStyles {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;MASU,gBAAgB,CAAA;wGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,8EALjB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,6khJAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAKD,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,QAAA,EACN,EAAE,EAAA,aAAA,EAEG,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,6khJAAA,CAAA,EAAA;;;AC5BjD;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-components-ckeditor-styles.mjs","sources":["../../../projects/sdcorejs-angular/components/ckeditor-styles/src/ckeditor-styles.component.ts","../../../projects/sdcorejs-angular/components/ckeditor-styles/sdcorejs-angular-components-ckeditor-styles.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * Styles-only component that loads the global CKEditor 5 stylesheet on demand.\n *\n * Why this exists:\n * - CKEditor's CSS must be global (applies to body-rendered overlays, dialogs, balloons),\n * which means whichever Angular component declares it must use ViewEncapsulation.None.\n * - Switching encapsulation on the main editor components (`<sd-editor>`, `<sd-mini-editor>`,\n * `<sd-document-builder>`) would un-scope all their local styles too.\n * - Instead, this tiny no-render component owns the global CSS. The editor components embed\n * `<sd-ckeditor-styles>` at the top of their template; the CSS is injected once into <head>\n * the first time any editor instance mounts. Editor components themselves keep\n * ViewEncapsulation.Emulated.\n *\n * Behavior:\n * - Renders nothing in the DOM (empty template).\n * - Angular dedupes styles per component class — multiple instances inject the <style> tag\n * only once.\n * - When the host editor component is lazy-loaded, this component's chunk and its CSS travel\n * with it.\n */\n@Component({\n selector: 'sd-ckeditor-styles',\n standalone: true,\n template: '',\n styleUrl: '../../../assets/scss/ckeditor5.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdCKEditorStyles {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;MASU,gBAAgB,CAAA;wGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,8EALjB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,6khJAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAKD,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,QAAA,EACN,EAAE,EAAA,aAAA,EAEG,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,6khJAAA,CAAA,EAAA;;;AC5BjD;;AAEG;;;;"}
@@ -2,9 +2,7 @@ import { Clipboard } from '@angular/cdk/clipboard';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
4
  import { inject, model, input, booleanAttribute, signal, computed, effect, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
5
- import * as i1 from '@angular/material/icon';
6
- import { MatIconModule } from '@angular/material/icon';
7
- import * as i2 from '@angular/material/tooltip';
5
+ import * as i1 from '@angular/material/tooltip';
8
6
  import { MatTooltipModule } from '@angular/material/tooltip';
9
7
  import { DomSanitizer } from '@angular/platform-browser';
10
8
  import * as Prism from 'prismjs';
@@ -13,6 +11,7 @@ import 'prismjs/components/prism-json';
13
11
  import 'prismjs/components/prism-css';
14
12
  import 'prismjs/components/prism-scss';
15
13
  import { TranslatePipe } from '@sdcorejs/angular/i18n';
14
+ import { SdIcon } from '@sdcorejs/angular/modules/icon';
16
15
  import 'prismjs/components/prism-markup';
17
16
 
18
17
  class SdCodeEditor {
@@ -33,7 +32,7 @@ class SdCodeEditor {
33
32
  copied = signal(false);
34
33
  // Chuỗi text nội bộ dùng để map với thẻ <textarea>
35
34
  textValue = signal('');
36
- prismLang = computed(() => this.language() === 'html' ? 'markup' : this.language());
35
+ prismLang = computed(() => (this.language() === 'html' ? 'markup' : this.language()));
37
36
  // Cờ lưu vết để chống Loop (Vòng lặp vô tận khi bắn 2 chiều)
38
37
  _lastEmittedValue = undefined;
39
38
  constructor() {
@@ -113,11 +112,11 @@ class SdCodeEditor {
113
112
  }
114
113
  }
115
114
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdCodeEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
116
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdCodeEditor, isStandalone: true, selector: "sd-code-editor", inputs: { valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange" }, ngImport: i0, template: "<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\n \n <div class=\"sd-code-header\">\n <div class=\"mac-dots\">\n <span class=\"dot red\"></span>\n <span class=\"dot yellow\"></span>\n <span class=\"dot green\"></span>\n </div>\n \n <div class=\"lang-badge\">\n {{ language().toUpperCase() }} \n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\n </span>\n </div>\n \n <button class=\"copy-btn\" [matTooltip]=\"copied() ? ('core.component.code-editor.copied' | translate) : 'Copy code'\" (click)=\"copyToClipboard()\">\n <mat-icon [class.text-success]=\"copied()\">{{ copied() ? 'check' : 'content_copy' }}</mat-icon>\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\n <div class=\"editor-overlay-container\">\n \n @if (!viewed()) {\n <textarea\n class=\"code-textarea\"\n [value]=\"textValue()\"\n (input)=\"onTextChange($any($event.target).value)\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\">\n </textarea>\n }\n \n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\n \n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.sd-code-wrapper{background-color:#1e1e1e;border-radius:8px;overflow:hidden;box-shadow:0 4px 12px #00000026;margin:16px 0;font-family:Fira Code,Consolas,Monaco,monospace}.sd-code-wrapper .sd-code-header{display:flex;align-items:center;justify-content:space-between;background-color:#2d2d2d;padding:8px 16px;border-bottom:1px solid #404040}.sd-code-wrapper .sd-code-header .mac-dots{display:flex;gap:6px}.sd-code-wrapper .sd-code-header .mac-dots .dot{width:12px;height:12px;border-radius:50%}.sd-code-wrapper .sd-code-header .mac-dots .dot.red{background-color:#ff5f56}.sd-code-wrapper .sd-code-header .mac-dots .dot.yellow{background-color:#ffbd2e}.sd-code-wrapper .sd-code-header .mac-dots .dot.green{background-color:#27c93f}.sd-code-wrapper .sd-code-header .lang-badge{color:#858585;font-size:12px;font-weight:600;letter-spacing:.5px}.sd-code-wrapper .sd-code-header .copy-btn{display:flex;align-items:center;gap:4px;background:none;border:none;color:#ccc;cursor:pointer;font-size:13px;padding:4px 8px;border-radius:4px;transition:all .2s ease}.sd-code-wrapper .sd-code-header .copy-btn mat-icon{font-size:16px;width:16px;height:16px}.sd-code-wrapper .sd-code-header .copy-btn:hover{background-color:#404040;color:#fff}.sd-code-wrapper .sd-code-header .copy-btn .text-success{color:#27c93f!important}.sd-code-wrapper .sd-code-content{overflow-y:auto;position:relative}.sd-code-wrapper .sd-code-content::-webkit-scrollbar{width:8px;height:8px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb:hover{background:#777}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-track{background:#1e1e1e}.sd-code-wrapper .sd-code-content .editor-overlay-container{position:relative;min-height:100px}.sd-code-wrapper .sd-code-content .code-textarea,.sd-code-wrapper .sd-code-content .code-display{margin:0;padding:16px;border:0;width:100%;min-height:100%;font-family:inherit;font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-all;tab-size:2}.sd-code-wrapper .sd-code-content .code-textarea{position:absolute;top:0;left:0;z-index:2;background:transparent!important;color:transparent!important;-webkit-text-fill-color:transparent!important;caret-color:#fff;resize:none;outline:none;overflow:hidden}.sd-code-wrapper .sd-code-content .code-display{position:relative;z-index:1;pointer-events:none}.sd-code-wrapper .sd-code-content .code-display code{color:#d4d4d4;font-family:inherit}.sd-code-wrapper .token.comment,.sd-code-wrapper .token.block-comment,.sd-code-wrapper .token.prolog,.sd-code-wrapper .token.doctype,.sd-code-wrapper .token.cdata{color:#999}.sd-code-wrapper .token.punctuation{color:#ccc}.sd-code-wrapper .token.tag,.sd-code-wrapper .token.attr-name,.sd-code-wrapper .token.namespace,.sd-code-wrapper .token.deleted{color:#e2777a}.sd-code-wrapper .token.function-name{color:#6196cc}.sd-code-wrapper .token.boolean,.sd-code-wrapper .token.number,.sd-code-wrapper .token.function{color:#f08d49}.sd-code-wrapper .token.property,.sd-code-wrapper .token.class-name,.sd-code-wrapper .token.constant,.sd-code-wrapper .token.symbol{color:#f8c555}.sd-code-wrapper .token.selector,.sd-code-wrapper .token.important,.sd-code-wrapper .token.atrule,.sd-code-wrapper .token.keyword,.sd-code-wrapper .token.builtin{color:#cc99cd}.sd-code-wrapper .token.string,.sd-code-wrapper .token.char,.sd-code-wrapper .token.attr-value,.sd-code-wrapper .token.regex,.sd-code-wrapper .token.variable{color:#7ec699}.sd-code-wrapper .token.operator,.sd-code-wrapper .token.entity,.sd-code-wrapper .token.url{color:#67cdcc}.sd-code-wrapper .token.important,.sd-code-wrapper .token.bold{font-weight:700}.sd-code-wrapper .token.italic{font-style:italic}.sd-code-wrapper .token.entity{cursor:help}.sd-code-wrapper .token.inserted{color:green}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
115
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdCodeEditor, isStandalone: true, selector: "sd-code-editor", inputs: { valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange" }, ngImport: i0, template: "<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\n\n <div class=\"sd-code-header\">\n <div class=\"mac-dots\">\n <span class=\"dot red\"></span>\n <span class=\"dot yellow\"></span>\n <span class=\"dot green\"></span>\n </div>\n\n <div class=\"lang-badge\">\n {{ language().toUpperCase() }}\n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\n </span>\n </div>\n\n <button class=\"copy-btn\" [matTooltip]=\"copied() ? ('core.component.code-editor.copied' | translate) : 'Copy code'\" (click)=\"copyToClipboard()\">\n <sd-icon [class.text-success]=\"copied()\" [name]=\"copied() ? 'check' : 'content_copy'\"></sd-icon>\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\n <div class=\"editor-overlay-container\">\n\n @if (!viewed()) {\n <textarea\n class=\"code-textarea\"\n [value]=\"textValue()\"\n (input)=\"onTextChange($any($event.target).value)\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\">\n </textarea>\n }\n\n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\n\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.sd-code-wrapper{background-color:#1e1e1e;border-radius:8px;overflow:hidden;box-shadow:0 4px 12px #00000026;margin:16px 0;font-family:Fira Code,Consolas,Monaco,monospace}.sd-code-wrapper .sd-code-header{display:flex;align-items:center;justify-content:space-between;background-color:#2d2d2d;padding:8px 16px;border-bottom:1px solid #404040}.sd-code-wrapper .sd-code-header .mac-dots{display:flex;gap:6px}.sd-code-wrapper .sd-code-header .mac-dots .dot{width:12px;height:12px;border-radius:50%}.sd-code-wrapper .sd-code-header .mac-dots .dot.red{background-color:#ff5f56}.sd-code-wrapper .sd-code-header .mac-dots .dot.yellow{background-color:#ffbd2e}.sd-code-wrapper .sd-code-header .mac-dots .dot.green{background-color:#27c93f}.sd-code-wrapper .sd-code-header .lang-badge{color:#858585;font-size:12px;font-weight:600;letter-spacing:.5px}.sd-code-wrapper .sd-code-header .copy-btn{display:flex;align-items:center;gap:4px;background:none;border:none;color:#ccc;cursor:pointer;font-size:13px;padding:4px 8px;border-radius:4px;transition:all .2s ease}.sd-code-wrapper .sd-code-header .copy-btn sd-icon{font-size:16px;width:16px;height:16px}.sd-code-wrapper .sd-code-header .copy-btn:hover{background-color:#404040;color:#fff}.sd-code-wrapper .sd-code-header .copy-btn .text-success{color:#27c93f!important}.sd-code-wrapper .sd-code-content{overflow-y:auto;position:relative}.sd-code-wrapper .sd-code-content::-webkit-scrollbar{width:8px;height:8px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb:hover{background:#777}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-track{background:#1e1e1e}.sd-code-wrapper .sd-code-content .editor-overlay-container{position:relative;min-height:100px}.sd-code-wrapper .sd-code-content .code-textarea,.sd-code-wrapper .sd-code-content .code-display{margin:0;padding:16px;border:0;width:100%;min-height:100%;font-family:inherit;font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-all;tab-size:2}.sd-code-wrapper .sd-code-content .code-textarea{position:absolute;top:0;left:0;z-index:2;background:transparent!important;color:transparent!important;-webkit-text-fill-color:transparent!important;caret-color:#fff;resize:none;outline:none;overflow:hidden}.sd-code-wrapper .sd-code-content .code-display{position:relative;z-index:1;pointer-events:none}.sd-code-wrapper .sd-code-content .code-display code{color:#d4d4d4;font-family:inherit}.sd-code-wrapper .token.comment,.sd-code-wrapper .token.block-comment,.sd-code-wrapper .token.prolog,.sd-code-wrapper .token.doctype,.sd-code-wrapper .token.cdata{color:#999}.sd-code-wrapper .token.punctuation{color:#ccc}.sd-code-wrapper .token.tag,.sd-code-wrapper .token.attr-name,.sd-code-wrapper .token.namespace,.sd-code-wrapper .token.deleted{color:#e2777a}.sd-code-wrapper .token.function-name{color:#6196cc}.sd-code-wrapper .token.boolean,.sd-code-wrapper .token.number,.sd-code-wrapper .token.function{color:#f08d49}.sd-code-wrapper .token.property,.sd-code-wrapper .token.class-name,.sd-code-wrapper .token.constant,.sd-code-wrapper .token.symbol{color:#f8c555}.sd-code-wrapper .token.selector,.sd-code-wrapper .token.important,.sd-code-wrapper .token.atrule,.sd-code-wrapper .token.keyword,.sd-code-wrapper .token.builtin{color:#cc99cd}.sd-code-wrapper .token.string,.sd-code-wrapper .token.char,.sd-code-wrapper .token.attr-value,.sd-code-wrapper .token.regex,.sd-code-wrapper .token.variable{color:#7ec699}.sd-code-wrapper .token.operator,.sd-code-wrapper .token.entity,.sd-code-wrapper .token.url{color:#67cdcc}.sd-code-wrapper .token.important,.sd-code-wrapper .token.bold{font-weight:700}.sd-code-wrapper .token.italic{font-style:italic}.sd-code-wrapper .token.entity{cursor:help}.sd-code-wrapper .token.inserted{color:green}\n"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
117
116
  }
118
117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdCodeEditor, decorators: [{
119
118
  type: Component,
120
- args: [{ selector: 'sd-code-editor', standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule, TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\n \n <div class=\"sd-code-header\">\n <div class=\"mac-dots\">\n <span class=\"dot red\"></span>\n <span class=\"dot yellow\"></span>\n <span class=\"dot green\"></span>\n </div>\n \n <div class=\"lang-badge\">\n {{ language().toUpperCase() }} \n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\n </span>\n </div>\n \n <button class=\"copy-btn\" [matTooltip]=\"copied() ? ('core.component.code-editor.copied' | translate) : 'Copy code'\" (click)=\"copyToClipboard()\">\n <mat-icon [class.text-success]=\"copied()\">{{ copied() ? 'check' : 'content_copy' }}</mat-icon>\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\n <div class=\"editor-overlay-container\">\n \n @if (!viewed()) {\n <textarea\n class=\"code-textarea\"\n [value]=\"textValue()\"\n (input)=\"onTextChange($any($event.target).value)\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\">\n </textarea>\n }\n \n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\n \n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.sd-code-wrapper{background-color:#1e1e1e;border-radius:8px;overflow:hidden;box-shadow:0 4px 12px #00000026;margin:16px 0;font-family:Fira Code,Consolas,Monaco,monospace}.sd-code-wrapper .sd-code-header{display:flex;align-items:center;justify-content:space-between;background-color:#2d2d2d;padding:8px 16px;border-bottom:1px solid #404040}.sd-code-wrapper .sd-code-header .mac-dots{display:flex;gap:6px}.sd-code-wrapper .sd-code-header .mac-dots .dot{width:12px;height:12px;border-radius:50%}.sd-code-wrapper .sd-code-header .mac-dots .dot.red{background-color:#ff5f56}.sd-code-wrapper .sd-code-header .mac-dots .dot.yellow{background-color:#ffbd2e}.sd-code-wrapper .sd-code-header .mac-dots .dot.green{background-color:#27c93f}.sd-code-wrapper .sd-code-header .lang-badge{color:#858585;font-size:12px;font-weight:600;letter-spacing:.5px}.sd-code-wrapper .sd-code-header .copy-btn{display:flex;align-items:center;gap:4px;background:none;border:none;color:#ccc;cursor:pointer;font-size:13px;padding:4px 8px;border-radius:4px;transition:all .2s ease}.sd-code-wrapper .sd-code-header .copy-btn mat-icon{font-size:16px;width:16px;height:16px}.sd-code-wrapper .sd-code-header .copy-btn:hover{background-color:#404040;color:#fff}.sd-code-wrapper .sd-code-header .copy-btn .text-success{color:#27c93f!important}.sd-code-wrapper .sd-code-content{overflow-y:auto;position:relative}.sd-code-wrapper .sd-code-content::-webkit-scrollbar{width:8px;height:8px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb:hover{background:#777}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-track{background:#1e1e1e}.sd-code-wrapper .sd-code-content .editor-overlay-container{position:relative;min-height:100px}.sd-code-wrapper .sd-code-content .code-textarea,.sd-code-wrapper .sd-code-content .code-display{margin:0;padding:16px;border:0;width:100%;min-height:100%;font-family:inherit;font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-all;tab-size:2}.sd-code-wrapper .sd-code-content .code-textarea{position:absolute;top:0;left:0;z-index:2;background:transparent!important;color:transparent!important;-webkit-text-fill-color:transparent!important;caret-color:#fff;resize:none;outline:none;overflow:hidden}.sd-code-wrapper .sd-code-content .code-display{position:relative;z-index:1;pointer-events:none}.sd-code-wrapper .sd-code-content .code-display code{color:#d4d4d4;font-family:inherit}.sd-code-wrapper .token.comment,.sd-code-wrapper .token.block-comment,.sd-code-wrapper .token.prolog,.sd-code-wrapper .token.doctype,.sd-code-wrapper .token.cdata{color:#999}.sd-code-wrapper .token.punctuation{color:#ccc}.sd-code-wrapper .token.tag,.sd-code-wrapper .token.attr-name,.sd-code-wrapper .token.namespace,.sd-code-wrapper .token.deleted{color:#e2777a}.sd-code-wrapper .token.function-name{color:#6196cc}.sd-code-wrapper .token.boolean,.sd-code-wrapper .token.number,.sd-code-wrapper .token.function{color:#f08d49}.sd-code-wrapper .token.property,.sd-code-wrapper .token.class-name,.sd-code-wrapper .token.constant,.sd-code-wrapper .token.symbol{color:#f8c555}.sd-code-wrapper .token.selector,.sd-code-wrapper .token.important,.sd-code-wrapper .token.atrule,.sd-code-wrapper .token.keyword,.sd-code-wrapper .token.builtin{color:#cc99cd}.sd-code-wrapper .token.string,.sd-code-wrapper .token.char,.sd-code-wrapper .token.attr-value,.sd-code-wrapper .token.regex,.sd-code-wrapper .token.variable{color:#7ec699}.sd-code-wrapper .token.operator,.sd-code-wrapper .token.entity,.sd-code-wrapper .token.url{color:#67cdcc}.sd-code-wrapper .token.important,.sd-code-wrapper .token.bold{font-weight:700}.sd-code-wrapper .token.italic{font-style:italic}.sd-code-wrapper .token.entity{cursor:help}.sd-code-wrapper .token.inserted{color:green}\n"] }]
119
+ args: [{ selector: 'sd-code-editor', standalone: true, imports: [SdIcon, CommonModule, MatTooltipModule, TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\n\n <div class=\"sd-code-header\">\n <div class=\"mac-dots\">\n <span class=\"dot red\"></span>\n <span class=\"dot yellow\"></span>\n <span class=\"dot green\"></span>\n </div>\n\n <div class=\"lang-badge\">\n {{ language().toUpperCase() }}\n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\n </span>\n </div>\n\n <button class=\"copy-btn\" [matTooltip]=\"copied() ? ('core.component.code-editor.copied' | translate) : 'Copy code'\" (click)=\"copyToClipboard()\">\n <sd-icon [class.text-success]=\"copied()\" [name]=\"copied() ? 'check' : 'content_copy'\"></sd-icon>\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\n <div class=\"editor-overlay-container\">\n\n @if (!viewed()) {\n <textarea\n class=\"code-textarea\"\n [value]=\"textValue()\"\n (input)=\"onTextChange($any($event.target).value)\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\">\n </textarea>\n }\n\n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\n\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.sd-code-wrapper{background-color:#1e1e1e;border-radius:8px;overflow:hidden;box-shadow:0 4px 12px #00000026;margin:16px 0;font-family:Fira Code,Consolas,Monaco,monospace}.sd-code-wrapper .sd-code-header{display:flex;align-items:center;justify-content:space-between;background-color:#2d2d2d;padding:8px 16px;border-bottom:1px solid #404040}.sd-code-wrapper .sd-code-header .mac-dots{display:flex;gap:6px}.sd-code-wrapper .sd-code-header .mac-dots .dot{width:12px;height:12px;border-radius:50%}.sd-code-wrapper .sd-code-header .mac-dots .dot.red{background-color:#ff5f56}.sd-code-wrapper .sd-code-header .mac-dots .dot.yellow{background-color:#ffbd2e}.sd-code-wrapper .sd-code-header .mac-dots .dot.green{background-color:#27c93f}.sd-code-wrapper .sd-code-header .lang-badge{color:#858585;font-size:12px;font-weight:600;letter-spacing:.5px}.sd-code-wrapper .sd-code-header .copy-btn{display:flex;align-items:center;gap:4px;background:none;border:none;color:#ccc;cursor:pointer;font-size:13px;padding:4px 8px;border-radius:4px;transition:all .2s ease}.sd-code-wrapper .sd-code-header .copy-btn sd-icon{font-size:16px;width:16px;height:16px}.sd-code-wrapper .sd-code-header .copy-btn:hover{background-color:#404040;color:#fff}.sd-code-wrapper .sd-code-header .copy-btn .text-success{color:#27c93f!important}.sd-code-wrapper .sd-code-content{overflow-y:auto;position:relative}.sd-code-wrapper .sd-code-content::-webkit-scrollbar{width:8px;height:8px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-thumb:hover{background:#777}.sd-code-wrapper .sd-code-content::-webkit-scrollbar-track{background:#1e1e1e}.sd-code-wrapper .sd-code-content .editor-overlay-container{position:relative;min-height:100px}.sd-code-wrapper .sd-code-content .code-textarea,.sd-code-wrapper .sd-code-content .code-display{margin:0;padding:16px;border:0;width:100%;min-height:100%;font-family:inherit;font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-all;tab-size:2}.sd-code-wrapper .sd-code-content .code-textarea{position:absolute;top:0;left:0;z-index:2;background:transparent!important;color:transparent!important;-webkit-text-fill-color:transparent!important;caret-color:#fff;resize:none;outline:none;overflow:hidden}.sd-code-wrapper .sd-code-content .code-display{position:relative;z-index:1;pointer-events:none}.sd-code-wrapper .sd-code-content .code-display code{color:#d4d4d4;font-family:inherit}.sd-code-wrapper .token.comment,.sd-code-wrapper .token.block-comment,.sd-code-wrapper .token.prolog,.sd-code-wrapper .token.doctype,.sd-code-wrapper .token.cdata{color:#999}.sd-code-wrapper .token.punctuation{color:#ccc}.sd-code-wrapper .token.tag,.sd-code-wrapper .token.attr-name,.sd-code-wrapper .token.namespace,.sd-code-wrapper .token.deleted{color:#e2777a}.sd-code-wrapper .token.function-name{color:#6196cc}.sd-code-wrapper .token.boolean,.sd-code-wrapper .token.number,.sd-code-wrapper .token.function{color:#f08d49}.sd-code-wrapper .token.property,.sd-code-wrapper .token.class-name,.sd-code-wrapper .token.constant,.sd-code-wrapper .token.symbol{color:#f8c555}.sd-code-wrapper .token.selector,.sd-code-wrapper .token.important,.sd-code-wrapper .token.atrule,.sd-code-wrapper .token.keyword,.sd-code-wrapper .token.builtin{color:#cc99cd}.sd-code-wrapper .token.string,.sd-code-wrapper .token.char,.sd-code-wrapper .token.attr-value,.sd-code-wrapper .token.regex,.sd-code-wrapper .token.variable{color:#7ec699}.sd-code-wrapper .token.operator,.sd-code-wrapper .token.entity,.sd-code-wrapper .token.url{color:#67cdcc}.sd-code-wrapper .token.important,.sd-code-wrapper .token.bold{font-weight:700}.sd-code-wrapper .token.italic{font-style:italic}.sd-code-wrapper .token.entity{cursor:help}.sd-code-wrapper .token.inserted{color:green}\n"] }]
121
120
  }], ctorParameters: () => [] });
122
121
 
123
122
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-code-editor.mjs","sources":["../../../projects/sdcorejs-angular/components/code-editor/src/code-editor.component.ts","../../../projects/sdcorejs-angular/components/code-editor/src/code-editor.component.html","../../../projects/sdcorejs-angular/components/code-editor/sdcorejs-angular-components-code-editor.ts"],"sourcesContent":["import { Clipboard } from '@angular/cdk/clipboard';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked,\n ViewEncapsulation,\n booleanAttribute\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nimport * as Prism from 'prismjs';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-scss';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport 'prismjs/components/prism-markup'; // HTML\n\nexport type CodeLanguage = 'html' | 'typescript' | 'json' | 'css' | 'scss';\n\n@Component({\n selector: 'sd-code-editor',\n standalone: true,\n imports: [CommonModule, MatIconModule, MatTooltipModule, TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './code-editor.component.html',\n styleUrls: ['./code-editor.component.scss'],\n encapsulation: ViewEncapsulation.None, // Bắt buộc để nhận màu Prism\n})\nexport class SdCodeEditor {\n #clipboard = inject(Clipboard);\n #sanitizer = inject(DomSanitizer);\n\n // ==========================================\n // 1. SIGNAL INPUTS & MODEL\n // ==========================================\n // Nhận bất kỳ kiểu dữ liệu nào (string, array, object)\n valueModel = model<any>(undefined, { alias: 'model' });\n \n language = input<CodeLanguage>('typescript');\n maxHeight = input<string>('500px');\n \n // Trạng thái Viewed (true = Read Only, false = Editable)\n viewed = input(false, { transform: booleanAttribute });\n\n // ==========================================\n // 2. INTERNAL STATE\n // ==========================================\n copied = signal<boolean>(false);\n \n // Chuỗi text nội bộ dùng để map với thẻ <textarea>\n textValue = signal<string>('');\n \n prismLang = computed(() => this.language() === 'html' ? 'markup' : this.language());\n\n // Cờ lưu vết để chống Loop (Vòng lặp vô tận khi bắn 2 chiều)\n private _lastEmittedValue: any = undefined;\n\n constructor() {\n // ==========================================\n // EFFECT 1: Dữ liệu từ CHA truyền vào (Model -> TextValue)\n // ==========================================\n effect(() => {\n const extVal = this.valueModel();\n const lang = this.language();\n \n untracked(() => {\n // Nếu giá trị này do chính component bắn ra, bỏ qua để tránh loop\n if (extVal === this._lastEmittedValue) return;\n\n if (typeof extVal === 'string') {\n this.textValue.set(extVal);\n } else if (extVal !== undefined && extVal !== null) {\n // Tự động format Object -> String nếu là JSON\n if (lang === 'json') {\n try {\n this.textValue.set(JSON.stringify(extVal, null, 2));\n } catch {\n this.textValue.set('// Lỗi: Object có tham chiếu vòng (Circular Reference)');\n }\n } else {\n this.textValue.set(String(extVal));\n }\n } else {\n this.textValue.set('');\n }\n });\n });\n }\n\n // ==========================================\n // EFFECT 2: PrismJS render (TextValue -> HTML MÀU)\n // ==========================================\n highlightedCode = computed<SafeHtml>(() => {\n // Dùng khoảng trắng để giữ độ cao cho thẻ pre nếu rỗng\n const rawCode = this.textValue() || ' '; \n const langKey = this.prismLang();\n const grammar = Prism.languages[langKey] || Prism.languages['markup'];\n \n // Cộng thêm \\n ở cuối để chống lỗi con trỏ textarea ăn lẹm dòng cuối\n const highlightedString = Prism.highlight(rawCode, grammar, langKey) + '\\n';\n return this.#sanitizer.bypassSecurityTrustHtml(highlightedString);\n });\n\n // ==========================================\n // EVENTS\n // ==========================================\n \n // Khi người dùng gõ vào Textarea (TextValue -> Model)\n onTextChange(newText: string) {\n this.textValue.set(newText);\n \n let valToEmit: any = newText;\n \n // Nếu ngôn ngữ là JSON, cố gắng trả về Object thật\n if (this.language() === 'json') {\n try {\n valToEmit = JSON.parse(newText);\n } catch {\n // Nếu gõ dở ngoặc/sai cú pháp -> Trả về chuỗi String tạm\n valToEmit = newText; \n }\n }\n \n // Ghi sổ và bắn ra ngoài\n this._lastEmittedValue = valToEmit;\n this.valueModel.set(valToEmit);\n }\n\n copyToClipboard() {\n const rawCode = this.textValue();\n if (!rawCode) return;\n \n if (this.#clipboard.copy(rawCode)) {\n this.copied.set(true);\n setTimeout(() => this.copied.set(false), 2000);\n }\n }\n}","<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\n \n <div class=\"sd-code-header\">\n <div class=\"mac-dots\">\n <span class=\"dot red\"></span>\n <span class=\"dot yellow\"></span>\n <span class=\"dot green\"></span>\n </div>\n \n <div class=\"lang-badge\">\n {{ language().toUpperCase() }} \n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\n </span>\n </div>\n \n <button class=\"copy-btn\" [matTooltip]=\"copied() ? ('core.component.code-editor.copied' | translate) : 'Copy code'\" (click)=\"copyToClipboard()\">\n <mat-icon [class.text-success]=\"copied()\">{{ copied() ? 'check' : 'content_copy' }}</mat-icon>\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\n <div class=\"editor-overlay-container\">\n \n @if (!viewed()) {\n <textarea\n class=\"code-textarea\"\n [value]=\"textValue()\"\n (input)=\"onTextChange($any($event.target).value)\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\">\n </textarea>\n }\n \n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\n \n </div>\n </div>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-components-code-editor.mjs","sources":["../../../projects/sdcorejs-angular/components/code-editor/src/code-editor.component.ts","../../../projects/sdcorejs-angular/components/code-editor/src/code-editor.component.html","../../../projects/sdcorejs-angular/components/code-editor/sdcorejs-angular-components-code-editor.ts"],"sourcesContent":["import { Clipboard } from '@angular/cdk/clipboard';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked,\n ViewEncapsulation,\n booleanAttribute,\n} from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nimport * as Prism from 'prismjs';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-scss';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport 'prismjs/components/prism-markup'; // HTML\n\nexport type CodeLanguage = 'html' | 'typescript' | 'json' | 'css' | 'scss';\n\n@Component({\n selector: 'sd-code-editor',\n standalone: true,\n imports: [SdIcon, CommonModule, MatTooltipModule, TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './code-editor.component.html',\n styleUrl: './code-editor.component.scss',\n encapsulation: ViewEncapsulation.None, // Bắt buộc để nhận màu Prism\n})\nexport class SdCodeEditor {\n #clipboard = inject(Clipboard);\n #sanitizer = inject(DomSanitizer);\n\n // ==========================================\n // 1. SIGNAL INPUTS & MODEL\n // ==========================================\n // Nhận bất kỳ kiểu dữ liệu nào (string, array, object)\n valueModel = model<any>(undefined, { alias: 'model' });\n\n language = input<CodeLanguage>('typescript');\n maxHeight = input<string>('500px');\n\n // Trạng thái Viewed (true = Read Only, false = Editable)\n viewed = input(false, { transform: booleanAttribute });\n\n // ==========================================\n // 2. INTERNAL STATE\n // ==========================================\n copied = signal<boolean>(false);\n\n // Chuỗi text nội bộ dùng để map với thẻ <textarea>\n textValue = signal<string>('');\n\n prismLang = computed(() => (this.language() === 'html' ? 'markup' : this.language()));\n\n // Cờ lưu vết để chống Loop (Vòng lặp vô tận khi bắn 2 chiều)\n private _lastEmittedValue: any = undefined;\n\n constructor() {\n // ==========================================\n // EFFECT 1: Dữ liệu từ CHA truyền vào (Model -> TextValue)\n // ==========================================\n effect(() => {\n const extVal = this.valueModel();\n const lang = this.language();\n\n untracked(() => {\n // Nếu giá trị này do chính component bắn ra, bỏ qua để tránh loop\n if (extVal === this._lastEmittedValue) return;\n\n if (typeof extVal === 'string') {\n this.textValue.set(extVal);\n } else if (extVal !== undefined && extVal !== null) {\n // Tự động format Object -> String nếu là JSON\n if (lang === 'json') {\n try {\n this.textValue.set(JSON.stringify(extVal, null, 2));\n } catch {\n this.textValue.set('// Lỗi: Object có tham chiếu vòng (Circular Reference)');\n }\n } else {\n this.textValue.set(String(extVal));\n }\n } else {\n this.textValue.set('');\n }\n });\n });\n }\n\n // ==========================================\n // EFFECT 2: PrismJS render (TextValue -> HTML MÀU)\n // ==========================================\n highlightedCode = computed<SafeHtml>(() => {\n // Dùng khoảng trắng để giữ độ cao cho thẻ pre nếu rỗng\n const rawCode = this.textValue() || ' ';\n const langKey = this.prismLang();\n const grammar = Prism.languages[langKey] || Prism.languages['markup'];\n\n // Cộng thêm \\n ở cuối để chống lỗi con trỏ textarea ăn lẹm dòng cuối\n const highlightedString = Prism.highlight(rawCode, grammar, langKey) + '\\n';\n return this.#sanitizer.bypassSecurityTrustHtml(highlightedString);\n });\n\n // ==========================================\n // EVENTS\n // ==========================================\n\n // Khi người dùng gõ vào Textarea (TextValue -> Model)\n onTextChange(newText: string) {\n this.textValue.set(newText);\n\n let valToEmit: any = newText;\n\n // Nếu ngôn ngữ là JSON, cố gắng trả về Object thật\n if (this.language() === 'json') {\n try {\n valToEmit = JSON.parse(newText);\n } catch {\n // Nếu gõ dở ngoặc/sai cú pháp -> Trả về chuỗi String tạm\n valToEmit = newText;\n }\n }\n\n // Ghi sổ và bắn ra ngoài\n this._lastEmittedValue = valToEmit;\n this.valueModel.set(valToEmit);\n }\n\n copyToClipboard() {\n const rawCode = this.textValue();\n if (!rawCode) return;\n\n if (this.#clipboard.copy(rawCode)) {\n this.copied.set(true);\n setTimeout(() => this.copied.set(false), 2000);\n }\n }\n}\n","<div class=\"sd-code-wrapper\" [class.is-editable]=\"!viewed()\">\n\n <div class=\"sd-code-header\">\n <div class=\"mac-dots\">\n <span class=\"dot red\"></span>\n <span class=\"dot yellow\"></span>\n <span class=\"dot green\"></span>\n </div>\n\n <div class=\"lang-badge\">\n {{ language().toUpperCase() }}\n <span style=\"opacity: 0.6; margin-left: 4px; font-weight: normal;\">\n {{ viewed() ? '(READ ONLY)' : '(EDITING)' }}\n </span>\n </div>\n\n <button class=\"copy-btn\" [matTooltip]=\"copied() ? ('core.component.code-editor.copied' | translate) : 'Copy code'\" (click)=\"copyToClipboard()\">\n <sd-icon [class.text-success]=\"copied()\" [name]=\"copied() ? 'check' : 'content_copy'\"></sd-icon>\n <span>{{ copied() ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n\n <div class=\"sd-code-content\" [style.maxHeight]=\"maxHeight()\">\n <div class=\"editor-overlay-container\">\n\n @if (!viewed()) {\n <textarea\n class=\"code-textarea\"\n [value]=\"textValue()\"\n (input)=\"onTextChange($any($event.target).value)\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\">\n </textarea>\n }\n\n <pre aria-hidden=\"true\" class=\"code-display\"><code [class]=\"'language-' + prismLang()\" [innerHTML]=\"highlightedCode()\"></code></pre>\n\n </div>\n </div>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ class PageNumberPlugin extends Plugin {
21
21
  view.set({
22
22
  label: i18n?.t('core.component.document-builder.page-number.current') ?? '',
23
23
  icon: '<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M16 2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H4V4h12v12zM6 6h2v2H6zm0 4h2v2H6zm0 4h2v2H6zm4-8h4v2h-4zm0 4h4v2h-4zm0 4h4v2h-4z"/></svg>', // Icon đơn giản
24
- tooltip: true
24
+ tooltip: true,
25
25
  });
26
26
  // Khi bấm nút -> Chèn HTML đánh dấu
27
27
  view.on('execute', () => {
@@ -42,7 +42,7 @@ class PageNumberPlugin extends Plugin {
42
42
  view.set({
43
43
  label: i18n?.t('core.component.document-builder.page-number.total') ?? '',
44
44
  icon: '<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/></svg>',
45
- tooltip: true
45
+ tooltip: true,
46
46
  });
47
47
  view.on('execute', () => {
48
48
  editor.model.change(writer => {
@@ -728,7 +728,7 @@ class VariablePlugin extends Plugin {
728
728
  const dataTransfer = data.dataTransfer;
729
729
  // Nếu có HTML chứa variable-widget thì để CKEditor xử lý (upcast converter)
730
730
  // Việc chống trùng uuid (regenerate) đã được xử lý ở upcast converter dựa vào biến isPasting
731
- let html = dataTransfer.getData('text/html');
731
+ const html = dataTransfer.getData('text/html');
732
732
  if (html && html.includes('variable-widget')) {
733
733
  return;
734
734
  }
@@ -1090,16 +1090,14 @@ class TableCustom extends Plugin {
1090
1090
  // Xử lý data-column-widths từ colgroup preservation
1091
1091
  editor.conversion.for('upcast').attributeToAttribute({
1092
1092
  view: 'data-column-widths',
1093
- model: 'tableColumnWidth'
1093
+ model: 'tableColumnWidth',
1094
1094
  });
1095
- console.log('[TableCustom] Registered data-column-widths upcast converter');
1096
1095
  // Xử lý border-style: none cho tableCell - phải explicit set 'none'
1097
1096
  dispatcher.on('element:td', (evt, data) => {
1098
1097
  if (!data.modelRange || !data.viewItem)
1099
1098
  return;
1100
1099
  const viewElement = data.viewItem;
1101
- const borderStyle = viewElement.getStyle('border-style') ||
1102
- this._parseBorderStyleFromShorthand(viewElement.getStyle('border'));
1100
+ const borderStyle = viewElement.getStyle('border-style') || this._parseBorderStyleFromShorthand(viewElement.getStyle('border'));
1103
1101
  // Nếu border-style là none hoặc border shorthand là none/0, explicit set 'none'
1104
1102
  if (borderStyle === 'none' || borderStyle === 'hidden') {
1105
1103
  for (const item of data.modelRange.getItems()) {
@@ -1117,8 +1115,7 @@ class TableCustom extends Plugin {
1117
1115
  if (!data.modelRange || !data.viewItem)
1118
1116
  return;
1119
1117
  const viewElement = data.viewItem;
1120
- const borderStyle = viewElement.getStyle('border-style') ||
1121
- this._parseBorderStyleFromShorthand(viewElement.getStyle('border'));
1118
+ const borderStyle = viewElement.getStyle('border-style') || this._parseBorderStyleFromShorthand(viewElement.getStyle('border'));
1122
1119
  // Nếu border-style là none hoặc border shorthand là none/0, explicit set 'none'
1123
1120
  if (borderStyle === 'none' || borderStyle === 'hidden') {
1124
1121
  for (const item of data.modelRange.getItems()) {
@@ -1234,7 +1231,7 @@ class TableCustom extends Plugin {
1234
1231
  'resizeTableRow',
1235
1232
  'resizeTableColumn',
1236
1233
  'setTableColumnWidth',
1237
- 'tableColumnWidth'
1234
+ 'tableColumnWidth',
1238
1235
  ];
1239
1236
  tableCommands.forEach(cmdName => {
1240
1237
  const cmd = editor.commands.get(cmdName);
@@ -1355,8 +1352,7 @@ class TableCustom extends Plugin {
1355
1352
  }
1356
1353
  }
1357
1354
  if (change.type === 'insert' && change.position) {
1358
- const tableElement = change.position.findAncestor?.('table') ||
1359
- change.position.parent?.findAncestor?.('table');
1355
+ const tableElement = change.position.findAncestor?.('table') || change.position.parent?.findAncestor?.('table');
1360
1356
  if (tableElement)
1361
1357
  tablesToFix.add(tableElement);
1362
1358
  }
@@ -1751,9 +1747,7 @@ function transformBookmarks(documentFragment, writer) {
1751
1747
  const elementsToChange = [];
1752
1748
  for (const value of writer.createRangeIn(documentFragment)) {
1753
1749
  const element = value.item;
1754
- if (element.is('element', 'a') &&
1755
- !element.hasAttribute('href') &&
1756
- (element.hasAttribute('id') || element.hasAttribute('name'))) {
1750
+ if (element.is('element', 'a') && !element.hasAttribute('href') && (element.hasAttribute('id') || element.hasAttribute('name'))) {
1757
1751
  elementsToChange.push(element);
1758
1752
  }
1759
1753
  }
@@ -2057,9 +2051,7 @@ function removeMSAttributes(documentFragment) {
2057
2051
  writer.removeStyle(styleName, item);
2058
2052
  }
2059
2053
  }
2060
- if (item.is('element', 'w:sdt') ||
2061
- item.is('element', 'w:sdtpr') && item.isEmpty ||
2062
- item.is('element', 'o:p') && item.isEmpty) {
2054
+ if (item.is('element', 'w:sdt') || (item.is('element', 'w:sdtpr') && item.isEmpty) || (item.is('element', 'o:p') && item.isEmpty)) {
2063
2055
  elementsToUnwrap.push(item);
2064
2056
  }
2065
2057
  }
@@ -2087,11 +2079,11 @@ function convertCssLengthToPx(value) {
2087
2079
  const numericValue = parseFloat(value);
2088
2080
  if (value.endsWith('pt')) {
2089
2081
  // 1pt = 1in / 72
2090
- return toPx(numericValue * 96 / 72);
2082
+ return toPx((numericValue * 96) / 72);
2091
2083
  }
2092
2084
  else if (value.endsWith('pc')) {
2093
2085
  // 1pc = 12pt = 1in / 6.
2094
- return toPx(numericValue * 12 * 96 / 72);
2086
+ return toPx((numericValue * 12 * 96) / 72);
2095
2087
  }
2096
2088
  else if (value.endsWith('in')) {
2097
2089
  // 1in = 2.54cm = 96px
@@ -2099,11 +2091,11 @@ function convertCssLengthToPx(value) {
2099
2091
  }
2100
2092
  else if (value.endsWith('cm')) {
2101
2093
  // 1cm = 96px / 2.54
2102
- return toPx(numericValue * 96 / 2.54);
2094
+ return toPx((numericValue * 96) / 2.54);
2103
2095
  }
2104
2096
  else if (value.endsWith('mm')) {
2105
2097
  // 1mm = 1cm / 10
2106
- return toPx(numericValue / 10 * 96 / 2.54);
2098
+ return toPx(((numericValue / 10) * 96) / 2.54);
2107
2099
  }
2108
2100
  return value;
2109
2101
  }
@@ -2554,9 +2546,7 @@ function findSibling(viewElement, direction, writer, { blockElements, inlineObje
2554
2546
  // * block element,
2555
2547
  // * inline object element.
2556
2548
  // It's ignoring any inline (non-object) elements like span, strong, etc.
2557
- position = position.getLastMatchingPosition(({ item }) => (item.is('element') &&
2558
- !blockElements.includes(item.name) &&
2559
- !inlineObjectElements.includes(item.name)), { direction });
2549
+ position = position.getLastMatchingPosition(({ item }) => item.is('element') && !blockElements.includes(item.name) && !inlineObjectElements.includes(item.name), { direction });
2560
2550
  return direction == 'forward' ? position.nodeAfter : position.nodeBefore;
2561
2551
  }
2562
2552
  /**
@@ -4149,7 +4139,8 @@ class CkCommentPlugin extends Plugin {
4149
4139
  const errorI18n = this.#getI18n();
4150
4140
  this.#config.onError?.({
4151
4141
  code: 'TEXT_TOO_LONG',
4152
- message: errorI18n?.t('core.component.document-builder.ck-comment.text-too-long', { length: trimmedText.length, max: maxTextLength }) ?? '',
4142
+ message: errorI18n?.t('core.component.document-builder.ck-comment.text-too-long', { length: trimmedText.length, max: maxTextLength }) ??
4143
+ '',
4153
4144
  data: { textLength: trimmedText.length, maxLength: maxTextLength },
4154
4145
  });
4155
4146
  return null;