@sd-angular/core 19.0.0-beta.6 → 19.0.0-beta.60

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 (219) hide show
  1. package/README.md +686 -33
  2. package/assets/scss/ckeditor5.scss +60 -2
  3. package/assets/scss/core/bootstrap.scss +17 -0
  4. package/assets/scss/core/form.scss +4 -1
  5. package/assets/scss/core/grid.scss +40 -0
  6. package/assets/scss/sd-core.scss +1 -0
  7. package/components/avatar/index.d.ts +1 -0
  8. package/components/avatar/src/avatar.component.d.ts +19 -0
  9. package/components/badge/src/badge.component.d.ts +77 -19
  10. package/components/button/src/button.component.d.ts +30 -28
  11. package/components/code-editor/index.d.ts +1 -0
  12. package/components/code-editor/src/code-editor.component.d.ts +25 -0
  13. package/components/document-builder/index.d.ts +1 -0
  14. package/components/document-builder/src/document-builder.component.d.ts +12 -41
  15. package/components/document-builder/src/document-builder.model.d.ts +14 -11
  16. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +9 -0
  17. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +44 -0
  18. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +57 -0
  19. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +1 -0
  20. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +4 -0
  21. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +31 -0
  22. package/components/document-builder/src/plugins/index.d.ts +7 -2
  23. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +2 -2
  24. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +14 -0
  25. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +15 -0
  26. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +25 -0
  27. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +29 -0
  28. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +35 -0
  29. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +15 -0
  30. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +15 -0
  31. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +15 -0
  32. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +15 -0
  33. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +15 -0
  34. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +15 -0
  35. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +54 -0
  36. package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +24 -0
  37. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +27 -0
  38. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +16 -0
  39. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +25 -0
  40. package/components/document-builder/src/plugins/paste-handler/index.d.ts +35 -0
  41. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +31 -0
  42. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +31 -0
  43. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +29 -0
  44. package/components/document-builder/src/plugins/paste-handler/types.d.ts +30 -0
  45. package/components/document-builder/src/plugins/table-custom/index.d.ts +34 -0
  46. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +39 -0
  47. package/components/index.d.ts +4 -0
  48. package/components/mini-editor/index.d.ts +2 -0
  49. package/components/mini-editor/src/mini-editor.component.d.ts +90 -0
  50. package/components/mini-editor/src/mini-editor.model.d.ts +44 -0
  51. package/components/section/src/section.component.d.ts +10 -11
  52. package/components/side-drawer/src/side-drawer.component.d.ts +11 -24
  53. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +4 -1
  54. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +3 -15
  55. package/components/table/src/components/column-filter/column-filter.component.d.ts +3 -3
  56. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +12 -2
  57. package/components/table/src/components/desktop-cell-view/desktop-cell-view.component.d.ts +12 -2
  58. package/components/table/src/components/external-filter/external-filter.component.d.ts +1 -1
  59. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +11 -10
  60. package/components/table/src/components/selector-action/selector-action.component.d.ts +5 -3
  61. package/components/table/src/directives/index.d.ts +2 -0
  62. package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +9 -0
  63. package/components/table/src/directives/sticky-shadow.directive.d.ts +17 -0
  64. package/components/table/src/models/table-column.model.d.ts +34 -34
  65. package/components/table/src/models/table-command.model.d.ts +7 -3
  66. package/components/table/src/models/table-item.model.d.ts +5 -4
  67. package/components/table/src/models/table-option-config.model.d.ts +5 -0
  68. package/components/table/src/models/table-option-export.model.d.ts +3 -2
  69. package/components/table/src/models/table-option-selector.model.d.ts +11 -10
  70. package/components/table/src/models/table-option.model.d.ts +10 -9
  71. package/components/table/src/services/index.d.ts +3 -0
  72. package/components/table/src/services/table-export/table-export.service.d.ts +26 -0
  73. package/components/table/src/services/table-filter/table-filter.model.d.ts +5 -4
  74. package/components/table/src/services/table-format/table-format.service.d.ts +16 -0
  75. package/components/table/src/table.component.d.ts +39 -53
  76. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +1 -1
  77. package/components/upload-file/src/services/upload-file.service.d.ts +0 -1
  78. package/components/upload-file/src/upload-file.component.d.ts +49 -54
  79. package/components/view/index.d.ts +1 -0
  80. package/components/view/src/view.component.d.ts +16 -0
  81. package/components/workflow/src/models/form-generic-component.model.d.ts +5 -4
  82. package/components/workflow/src/models/index.d.ts +1 -0
  83. package/directives/index.d.ts +1 -0
  84. package/directives/src/sd-href.directive.d.ts +9 -0
  85. package/fesm2022/sd-angular-core-components-avatar.mjs +103 -0
  86. package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -0
  87. package/fesm2022/sd-angular-core-components-badge.mjs +101 -91
  88. package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
  89. package/fesm2022/sd-angular-core-components-button.mjs +70 -96
  90. package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
  91. package/fesm2022/sd-angular-core-components-code-editor.mjs +129 -0
  92. package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -0
  93. package/fesm2022/sd-angular-core-components-document-builder.mjs +3994 -608
  94. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  95. package/fesm2022/sd-angular-core-components-history.mjs +1 -1
  96. package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
  97. package/fesm2022/sd-angular-core-components-import-excel.mjs +1 -1
  98. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  99. package/fesm2022/sd-angular-core-components-mini-editor.mjs +326 -0
  100. package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -0
  101. package/fesm2022/sd-angular-core-components-preview.mjs +1 -1
  102. package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
  103. package/fesm2022/sd-angular-core-components-section.mjs +24 -42
  104. package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
  105. package/fesm2022/sd-angular-core-components-side-drawer.mjs +78 -84
  106. package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
  107. package/fesm2022/sd-angular-core-components-tab-router.mjs +152 -226
  108. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  109. package/fesm2022/sd-angular-core-components-table.mjs +1129 -1131
  110. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  111. package/fesm2022/sd-angular-core-components-upload-file.mjs +339 -444
  112. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  113. package/fesm2022/sd-angular-core-components-view.mjs +45 -0
  114. package/fesm2022/sd-angular-core-components-view.mjs.map +1 -0
  115. package/fesm2022/sd-angular-core-components-workflow.mjs +47 -57
  116. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  117. package/fesm2022/sd-angular-core-components.mjs +4 -0
  118. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  119. package/fesm2022/sd-angular-core-directives.mjs +80 -27
  120. package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
  121. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +274 -364
  122. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  123. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +5 -2
  124. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  125. package/fesm2022/sd-angular-core-forms-chip.mjs +5 -2
  126. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  127. package/fesm2022/sd-angular-core-forms-date-range.mjs +160 -245
  128. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  129. package/fesm2022/sd-angular-core-forms-date.mjs +153 -273
  130. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  131. package/fesm2022/sd-angular-core-forms-datetime.mjs +152 -288
  132. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  133. package/fesm2022/sd-angular-core-forms-input-number.mjs +191 -338
  134. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  135. package/fesm2022/sd-angular-core-forms-input.mjs +149 -287
  136. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  137. package/fesm2022/sd-angular-core-forms-radio.mjs +3 -2
  138. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  139. package/fesm2022/sd-angular-core-forms-select.mjs +375 -448
  140. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  141. package/fesm2022/sd-angular-core-forms-textarea.mjs +138 -227
  142. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  143. package/fesm2022/sd-angular-core-modules-keycloak.mjs +126 -0
  144. package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -0
  145. package/fesm2022/sd-angular-core-modules-layout.mjs +454 -453
  146. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  147. package/fesm2022/sd-angular-core-modules.mjs +1 -1
  148. package/fesm2022/sd-angular-core-services-api.mjs +5 -10
  149. package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
  150. package/fesm2022/sd-angular-core-services-confirm.mjs +2 -2
  151. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  152. package/fesm2022/sd-angular-core-services-docx.mjs +173 -0
  153. package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -0
  154. package/fesm2022/sd-angular-core-services-notify.mjs +2 -2
  155. package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
  156. package/fesm2022/sd-angular-core-services.mjs +1 -0
  157. package/fesm2022/sd-angular-core-services.mjs.map +1 -1
  158. package/fesm2022/sd-angular-core-utilities-extensions.mjs +21 -45
  159. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  160. package/fesm2022/sd-angular-core-utilities-models.mjs +15 -1
  161. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  162. package/forms/autocomplete/src/autocomplete.component.d.ts +50 -55
  163. package/forms/chip/src/chip.component.d.ts +3 -2
  164. package/forms/chip-calendar/src/chip-calendar.component.d.ts +3 -2
  165. package/forms/date/src/date.component.d.ts +43 -46
  166. package/forms/date-range/src/date-range.component.d.ts +30 -34
  167. package/forms/datetime/src/datetime.component.d.ts +43 -49
  168. package/forms/input/src/input.component.d.ts +48 -57
  169. package/forms/input-number/src/input-number.component.d.ts +48 -54
  170. package/forms/select/src/select.component.d.ts +62 -64
  171. package/forms/textarea/src/textarea.component.d.ts +36 -42
  172. package/modules/index.d.ts +1 -1
  173. package/modules/keycloak/index.d.ts +4 -0
  174. package/modules/keycloak/keycloak.configuration.d.ts +11 -0
  175. package/modules/keycloak/keycloak.interceptor.d.ts +2 -0
  176. package/modules/keycloak/keycloak.module.d.ts +18 -0
  177. package/modules/keycloak/keycloak.service.d.ts +14 -0
  178. package/modules/layout/components/layout-main/layout-main.component.d.ts +7 -12
  179. package/modules/layout/components/page/page.component.d.ts +5 -7
  180. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +22 -29
  181. package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +11 -17
  182. package/modules/layout/components/sidebar-v1/main.component.d.ts +14 -14
  183. package/modules/layout/configurations/layout.configuration.d.ts +46 -3
  184. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +3 -8
  185. package/modules/layout/modules/home/components/home-page/home-page.component.d.ts +2 -5
  186. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +3 -8
  187. package/modules/layout/pipes/high-light-search.pipe.d.ts +1 -1
  188. package/modules/layout/services/index.d.ts +1 -0
  189. package/modules/layout/services/layout.service.d.ts +10 -0
  190. package/modules/layout/services/menu/menu.model.d.ts +2 -0
  191. package/modules/layout/services/storage/storage.service.d.ts +0 -3
  192. package/package.json +93 -70
  193. package/sd-angular-core-19.0.0-beta.60.tgz +0 -0
  194. package/services/api/src/api.model.d.ts +6 -1
  195. package/services/confirm/src/lib/confirm.service.d.ts +1 -0
  196. package/services/docx/index.d.ts +1 -0
  197. package/services/docx/src/lib/docx.model.d.ts +9 -0
  198. package/services/docx/src/lib/docx.service.d.ts +13 -0
  199. package/services/docx/src/public-api.d.ts +2 -0
  200. package/services/index.d.ts +1 -0
  201. package/services/notify/index.d.ts +1 -0
  202. package/services/notify/src/notify.model.d.ts +1 -1
  203. package/services/notify/src/notify.service.d.ts +5 -5
  204. package/utilities/extensions/src/string.extension.d.ts +2 -0
  205. package/utilities/extensions/src/utility.extension.d.ts +1 -0
  206. package/utilities/models/index.d.ts +3 -0
  207. package/utilities/models/src/filter.model.d.ts +14 -2
  208. package/utilities/models/src/icon.model.d.ts +2 -0
  209. package/utilities/models/src/nested-key-of.model.d.ts +5 -0
  210. package/utilities/models/src/pattern.model.d.ts +1 -1
  211. package/utilities/models/src/unwrap-signal.model.d.ts +6 -0
  212. package/components/document-builder/src/plugins/comment/comment.plugin.d.ts +0 -4
  213. package/components/document-builder/src/plugins/table-fit/table-fit.plugin.d.ts +0 -4
  214. package/fesm2022/sd-angular-core-modules-oidc.mjs +0 -127
  215. package/fesm2022/sd-angular-core-modules-oidc.mjs.map +0 -1
  216. package/modules/oidc/dynamic-sts.loader.d.ts +0 -11
  217. package/modules/oidc/index.d.ts +0 -2
  218. package/modules/oidc/oidc.configuration.d.ts +0 -11
  219. package/modules/oidc/oidc.module.d.ts +0 -14
@@ -17,15 +17,73 @@
17
17
  // Import the editor styles.
18
18
  // @import '@ckeditor/ckeditor5-editor-classic/dist/index.css';
19
19
  @import '@ckeditor/ckeditor5-essentials/dist/index.css';
20
+ @import '@ckeditor/ckeditor5-page-break/dist/index.css';
20
21
  @import '@ckeditor/ckeditor5-autoformat/dist/index.css';
21
22
  @import '@ckeditor/ckeditor5-basic-styles/dist/index.css';
22
23
  // @import '@ckeditor/ckeditor5-block-quote/dist/index.css';
23
24
  @import '@ckeditor/ckeditor5-heading/dist/index.css';
24
- @import '@ckeditor/ckeditor5-image/dist/index.css';
25
+ // @import '@ckeditor/ckeditor5-image/dist/index.css';
26
+ @import '@ckeditor/ckeditor5-image/dist/index-editor.css';
25
27
  @import '@ckeditor/ckeditor5-indent/dist/index.css';
26
28
  @import '@ckeditor/ckeditor5-link/dist/index.css';
27
29
  @import '@ckeditor/ckeditor5-list/dist/index.css';
28
30
  // @import '@ckeditor/ckeditor5-media-embed/dist/index.css';
29
31
  @import '@ckeditor/ckeditor5-paste-from-office/dist/index.css';
30
- @import '@ckeditor/ckeditor5-table/dist/index.css';
32
+
33
+ // hung.pham16: không sử dụng default styles của ckeditor vì server không hỗ trợ
34
+ // @import '@ckeditor/ckeditor5-table/dist/index.css';
35
+ @import '@ckeditor/ckeditor5-table/dist/index-editor.css';
36
+
31
37
  // @import '@ckeditor/ckeditor5-mention/dist/index.css';
38
+
39
+ // Custom toolbar
40
+ .ck-editor {
41
+ /* --- 1. GIẢM KÍCH THƯỚC ICON VÀ CHỮ --- */
42
+ /* Giảm cỡ chữ trong dropdown (mặc định khoảng 13px) */
43
+ --ck-font-size-base: 11px !important;
44
+
45
+ /* Giảm kích thước Icon (mặc định 20px) */
46
+ --ck-icon-size: 16px !important;
47
+
48
+ /* --- 2. TỐI ƯU KHOẢNG CÁCH (Padding/Margin) --- */
49
+
50
+ /* Giảm khoảng cách giữa các nút */
51
+ --ck-spacing-small: 2px !important;
52
+ --ck-spacing-standard: 6px !important;
53
+ --ck-spacing-large: 8px !important;
54
+
55
+ /* */
56
+ --ck-color-table-focused-cell-background: transparent !important;
57
+ --ck-table-content-default-border-color: transparent !important;
58
+
59
+ //
60
+ --ck-insert-table-dropdown-padding: 10px;
61
+ --ck-insert-table-dropdown-box-height: 16px;
62
+ --ck-insert-table-dropdown-box-width: 16px;
63
+ --ck-insert-table-dropdown-box-margin: 1px;
64
+
65
+ --ck-focus-ring: 1px solid var(--ck-color-base-border);
66
+ }
67
+
68
+ /* Giảm độ cao của thanh toolbar (cho gọn) */
69
+ .ck-toolbar {
70
+ min-height: 32px !important; /* Mặc định thường là 40px */
71
+ padding: 2px !important;
72
+
73
+ /* Làm màu nền toolbar nhạt hơn cho hiện đại */
74
+ background: #f8f9fa !important;
75
+ border-bottom: 1px solid #e0e0e0 !important;
76
+ }
77
+
78
+ .ck-toolbar__items {
79
+ /* Chỉnh nút bấm trong toolbar nhỏ lại */
80
+ > .ck-button {
81
+ padding: 2px 4px !important; /* Giảm padding trái phải của nút */
82
+ min-height: 24px !important;
83
+ }
84
+
85
+ /* Chỉnh lại dropdown (Heading, Font Size) cho khớp */
86
+ > .ck-dropdown {
87
+ min-height: 24px !important;
88
+ }
89
+ }
@@ -81,6 +81,23 @@
81
81
  .fs-#{$i} {
82
82
  font-size: #{$i}px !important;
83
83
  }
84
+
85
+ // Gap
86
+ .gap-#{$i} {
87
+ gap: #{$i}px !important;
88
+ }
89
+
90
+ .gap-y-#{$i} {
91
+ row-gap: #{$i}px !important;
92
+ }
93
+
94
+ .gap-x-#{$i} {
95
+ column-gap: #{$i}px !important;
96
+ }
97
+ }
98
+
99
+ .flex-1 {
100
+ flex: 1;
84
101
  }
85
102
 
86
103
  .w-full {
@@ -89,8 +89,11 @@
89
89
  }
90
90
  }
91
91
 
92
- // Size normal
92
+ // Size normal`
93
93
  &.sd-md {
94
+ --mat-form-field-container-height: 40px;
95
+ --mat-form-field-container-vertical-padding: 3px;
96
+
94
97
  &.mat-form-field-appearance-outline {
95
98
  .mat-mdc-form-field-infix {
96
99
  padding: 0 0 8px 0 !important;
@@ -0,0 +1,40 @@
1
+ /* ==========================================================================
2
+ CSS GRID UTILITIES
3
+ ========================================================================== */
4
+
5
+ /* 1. Kích hoạt Grid cơ bản */
6
+ .sd-grid-container {
7
+ display: grid;
8
+ column-gap: 8px;
9
+ row-gap: 0px;
10
+
11
+ /* 2. Định nghĩa tổng số cột của Grid Cha (từ 1 đến 12 cột) */
12
+ @for $i from 1 through 12 {
13
+ &.grid-cols-#{$i} {
14
+ /* Dùng minmax(0, 1fr) thay vì 1fr để chống vỡ layout khi nội dung text quá dài */
15
+ grid-template-columns: repeat($i, minmax(0, 1fr));
16
+ }
17
+ }
18
+
19
+ /* 3. Tiện ích chiếm CỘT (Column Spanning) cho phần tử con */
20
+ @for $i from 1 through 12 {
21
+ .col-span-#{$i} {
22
+ grid-column: span #{$i} / span #{$i};
23
+ }
24
+ }
25
+ /* Chiếm toàn bộ số cột hiện có (Full width) */
26
+ .col-span-full {
27
+ grid-column: 1 / -1;
28
+ }
29
+
30
+ /* 4. Tiện ích chiếm HÀNG (Row Spanning) cho phần tử con */
31
+ @for $i from 1 through 12 {
32
+ .row-span-#{$i} {
33
+ grid-row: span #{$i} / span #{$i};
34
+ }
35
+ }
36
+ /* Chiếm toàn bộ hàng (Full height) */
37
+ .row-span-full {
38
+ grid-row: 1 / -1;
39
+ }
40
+ }
@@ -7,6 +7,7 @@
7
7
  @use './core/typography.scss';
8
8
  @use './core/print.scss';
9
9
  @use './core/elevation.scss';
10
+ @use './core/grid.scss';
10
11
  @use './themes/default.scss';
11
12
  @use './themes/material-theme.scss';
12
13
 
@@ -0,0 +1 @@
1
+ export * from './src/avatar.component';
@@ -0,0 +1,19 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class SdAvatar {
3
+ #private;
4
+ /**
5
+ * The source string to be used for the avatar.
6
+ * - If it matches a URL pattern, an image is displayed.
7
+ * - If it is a string representing a name, initials and a colored background are generated.
8
+ * - If undefined, it falls back to a neutral ? initial.
9
+ */
10
+ readonly src: import("@angular/core").InputSignal<string | null | undefined>;
11
+ readonly size: import("@angular/core").InputSignal<number>;
12
+ constructor();
13
+ readonly isUrl: import("@angular/core").Signal<boolean>;
14
+ readonly bgColor: import("@angular/core").Signal<string>;
15
+ readonly initials: import("@angular/core").Signal<string>;
16
+ handleError(): void;
17
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdAvatar, never>;
18
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdAvatar, "sd-avatar", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19
+ }
@@ -1,27 +1,85 @@
1
1
  import { EventEmitter } from '@angular/core';
2
2
  import { SdColor, SdSize } from '@sd-angular/core/utilities/models';
3
+ import { MaterialIconFontSet } from '@sd-angular/core/utilities/models';
3
4
  import * as i0 from "@angular/core";
5
+ export type SdBadgeType = 'tag' | 'round' | 'icon';
4
6
  export declare class SdBadge {
5
7
  defaultIcon: string;
6
- type: 'tag' | 'round' | 'icon';
7
- set _type(type: 'tag' | 'round' | 'icon' | undefined | null);
8
- color: SdColor;
9
- set _color(color: SdColor | undefined | null);
10
- set primary(value: boolean | '');
11
- set secondary(value: boolean | '');
12
- set success(value: boolean | '' | undefined | null);
13
- set info(value: boolean | '' | undefined | null);
14
- set warning(value: boolean | '' | undefined | null);
15
- set error(value: boolean | '' | undefined | null);
16
- fontSet: 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp';
17
- set _fontSet(fontSet: 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp' | undefined | null);
18
- title: string | number | undefined | null;
19
- description: string | undefined | null;
20
- tooltip: string | undefined | null;
21
- icon: string | undefined | null;
22
- size: SdSize;
23
- sdClick: EventEmitter<any>;
8
+ type: import("@angular/core").InputSignalWithTransform<SdBadgeType, SdBadgeType | null | undefined>;
9
+ color: import("@angular/core").InputSignalWithTransform<SdColor, SdColor | null | undefined>;
10
+ primary: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
11
+ secondary: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
12
+ success: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
13
+ info: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
14
+ warning: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
15
+ error: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
16
+ fontSet: import("@angular/core").InputSignalWithTransform<MaterialIconFontSet, MaterialIconFontSet | null | undefined>;
17
+ title: import("@angular/core").InputSignal<string | number | null | undefined>;
18
+ description: import("@angular/core").InputSignal<string | null | undefined>;
19
+ tooltip: import("@angular/core").InputSignal<string | null | undefined>;
20
+ icon: import("@angular/core").InputSignal<string | null | undefined>;
21
+ size: import("@angular/core").InputSignalWithTransform<SdSize, SdSize | null | undefined>;
22
+ click: EventEmitter<Event>;
24
23
  onClick: (event: Event) => void;
24
+ effectiveColor: import("@angular/core").Signal<SdColor>;
25
+ baseColorClasses: import("@angular/core").Signal<{
26
+ 'c-primary': boolean;
27
+ 'c-secondary': boolean;
28
+ 'c-info': boolean;
29
+ 'c-success': boolean;
30
+ 'c-warning': boolean;
31
+ 'c-error': boolean;
32
+ }>;
33
+ iconColorClasses: import("@angular/core").Signal<{
34
+ 'c-primary': boolean;
35
+ 'c-black400': boolean;
36
+ 'c-info': boolean;
37
+ 'c-success': boolean;
38
+ 'c-warning': boolean;
39
+ 'c-error': boolean;
40
+ }>;
41
+ iconSizeAndFontClasses: import("@angular/core").Signal<{
42
+ 'c-xs': boolean;
43
+ 'c-sm': boolean;
44
+ 'c-md': boolean;
45
+ 'c-lg': boolean;
46
+ 'material-icons': boolean;
47
+ 'material-icons-outlined': boolean;
48
+ 'material-icons-round': boolean;
49
+ 'material-icons-sharp': boolean;
50
+ }>;
51
+ tagIconCombinedClasses: import("@angular/core").Signal<{
52
+ 'c-primary': boolean;
53
+ 'c-secondary': boolean;
54
+ 'c-info': boolean;
55
+ 'c-success': boolean;
56
+ 'c-warning': boolean;
57
+ 'c-error': boolean;
58
+ 'c-xs': boolean;
59
+ 'c-sm': boolean;
60
+ 'c-md': boolean;
61
+ 'c-lg': boolean;
62
+ 'material-icons': boolean;
63
+ 'material-icons-outlined': boolean;
64
+ 'material-icons-round': boolean;
65
+ 'material-icons-sharp': boolean;
66
+ }>;
67
+ iconCombinedClasses: import("@angular/core").Signal<{
68
+ 'c-primary': boolean;
69
+ 'c-black400': boolean;
70
+ 'c-info': boolean;
71
+ 'c-success': boolean;
72
+ 'c-warning': boolean;
73
+ 'c-error': boolean;
74
+ 'c-xs': boolean;
75
+ 'c-sm': boolean;
76
+ 'c-md': boolean;
77
+ 'c-lg': boolean;
78
+ 'material-icons': boolean;
79
+ 'material-icons-outlined': boolean;
80
+ 'material-icons-round': boolean;
81
+ 'material-icons-sharp': boolean;
82
+ }>;
25
83
  static ɵfac: i0.ɵɵFactoryDeclaration<SdBadge, never>;
26
- static ɵcmp: i0.ɵɵComponentDeclaration<SdBadge, "sd-badge", never, { "_type": { "alias": "type"; "required": false; }; "_color": { "alias": "color"; "required": false; }; "primary": { "alias": "primary"; "required": false; }; "secondary": { "alias": "secondary"; "required": false; }; "success": { "alias": "success"; "required": false; }; "info": { "alias": "info"; "required": false; }; "warning": { "alias": "warning"; "required": false; }; "error": { "alias": "error"; "required": false; }; "_fontSet": { "alias": "fontSet"; "required": false; }; "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, { "sdClick": "sdClick"; }, never, never, true, never>;
84
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdBadge, "sd-badge", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "primary": { "alias": "primary"; "required": false; "isSignal": true; }; "secondary": { "alias": "secondary"; "required": false; "isSignal": true; }; "success": { "alias": "success"; "required": false; "isSignal": true; }; "info": { "alias": "info"; "required": false; "isSignal": true; }; "warning": { "alias": "warning"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "fontSet": { "alias": "fontSet"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "click": "click"; }, never, never, true, never>;
27
85
  }
@@ -1,39 +1,41 @@
1
- import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { SdBaseSecureComponent } from '@sd-angular/core/components/base';
3
- import { SdColor } from '@sd-angular/core/utilities/models';
3
+ import { MaterialIconFontSet, SdColor } from '@sd-angular/core/utilities/models';
4
4
  import * as i0 from "@angular/core";
5
+ export type SdButtonType = 'fill' | 'light' | 'outline' | 'link';
6
+ export type SdButtonSize = 'sm' | 'md' | 'lg';
7
+ export type SdButtonHtmlType = 'button' | 'submit' | 'reset';
5
8
  export declare class SdButton extends SdBaseSecureComponent implements OnInit, OnDestroy {
6
9
  #private;
7
- autoId?: string;
8
- set _autoId(val: string | undefined | null);
9
- type: 'fill' | 'light' | 'outline' | 'link';
10
- set _type(type: 'fill' | 'light' | 'outline' | 'link' | undefined | null);
11
- color: SdColor;
12
- set _color(color: SdColor | undefined | null);
13
- title: string | undefined | null;
14
- width: string | undefined | null;
15
- size: 'sm' | 'md' | 'lg' | undefined | null;
16
- tooltip: string | undefined | null;
17
- prefixIcon: string | undefined | null;
18
- suffixIcon: string | undefined | null;
19
- fontSet: 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp' | 'material-symbols-outlined';
20
- set _fontSet(fontSet: SdButton['fontSet'] | undefined | null);
21
- disabled: boolean;
22
- get disabledAttr(): "true" | null;
23
- set _disabled(value: '' | boolean | undefined | null);
24
- loading: boolean;
25
- click: EventEmitter<Event>;
26
- constructor();
27
- ngOnInit(): void;
28
- onInternalClick(event: Event): void;
29
- ngOnDestroy(): void;
30
- get buttonClasses(): {
10
+ private el;
11
+ autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
12
+ type: import("@angular/core").InputSignalWithTransform<SdButtonType, SdButtonType | null | undefined>;
13
+ color: import("@angular/core").InputSignalWithTransform<SdColor, SdColor | null | undefined>;
14
+ size: import("@angular/core").InputSignalWithTransform<SdButtonSize, SdButtonSize | null | undefined>;
15
+ fontSet: import("@angular/core").InputSignalWithTransform<MaterialIconFontSet, MaterialIconFontSet | null | undefined>;
16
+ title: import("@angular/core").InputSignal<string | null | undefined>;
17
+ width: import("@angular/core").InputSignal<string | null | undefined>;
18
+ tooltip: import("@angular/core").InputSignal<string | null | undefined>;
19
+ prefixIcon: import("@angular/core").InputSignal<string | null | undefined>;
20
+ suffixIcon: import("@angular/core").InputSignal<string | null | undefined>;
21
+ disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
22
+ loading: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
23
+ block: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
24
+ htmlType: import("@angular/core").InputSignalWithTransform<SdButtonHtmlType, SdButtonHtmlType | null | undefined>;
25
+ autoId: import("@angular/core").Signal<string | undefined>;
26
+ buttonClasses: import("@angular/core").Signal<{
31
27
  'c-square': boolean | "" | null | undefined;
32
28
  'c-sm': boolean;
33
29
  'c-md': boolean;
34
30
  'c-lg': boolean;
35
31
  'c-disabled': boolean;
36
- };
32
+ 'c-block': boolean;
33
+ }>;
34
+ click: import("@angular/core").OutputEmitterRef<Event>;
35
+ constructor();
36
+ ngOnInit(): void;
37
+ onInternalClick(event: Event): void;
38
+ ngOnDestroy(): void;
37
39
  static ɵfac: i0.ɵɵFactoryDeclaration<SdButton, never>;
38
- static ɵcmp: i0.ɵɵComponentDeclaration<SdButton, "sd-button", never, { "_autoId": { "alias": "autoId"; "required": false; }; "_type": { "alias": "type"; "required": false; }; "_color": { "alias": "color"; "required": false; }; "title": { "alias": "title"; "required": false; }; "width": { "alias": "width"; "required": false; }; "size": { "alias": "size"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; }; "_fontSet": { "alias": "fontSet"; "required": false; }; "_disabled": { "alias": "disabled"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; }, { "click": "click"; }, never, never, true, never>;
40
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdButton, "sd-button", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "fontSet": { "alias": "fontSet"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; "isSignal": true; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "block": { "alias": "block"; "required": false; "isSignal": true; }; "htmlType": { "alias": "htmlType"; "required": false; "isSignal": true; }; }, { "click": "click"; }, never, never, true, never>;
39
41
  }
@@ -0,0 +1 @@
1
+ export * from './src/code-editor.component';
@@ -0,0 +1,25 @@
1
+ import { SafeHtml } from '@angular/platform-browser';
2
+ import 'prismjs/components/prism-typescript';
3
+ import 'prismjs/components/prism-json';
4
+ import 'prismjs/components/prism-css';
5
+ import 'prismjs/components/prism-scss';
6
+ import 'prismjs/components/prism-markup';
7
+ import * as i0 from "@angular/core";
8
+ export type CodeLanguage = 'html' | 'typescript' | 'json' | 'css' | 'scss';
9
+ export declare class SdCodeEditor {
10
+ #private;
11
+ valueModel: import("@angular/core").ModelSignal<any>;
12
+ language: import("@angular/core").InputSignal<CodeLanguage>;
13
+ maxHeight: import("@angular/core").InputSignal<string>;
14
+ viewed: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
15
+ copied: import("@angular/core").WritableSignal<boolean>;
16
+ textValue: import("@angular/core").WritableSignal<string>;
17
+ prismLang: import("@angular/core").Signal<CodeLanguage | "markup">;
18
+ private _lastEmittedValue;
19
+ constructor();
20
+ highlightedCode: import("@angular/core").Signal<SafeHtml>;
21
+ onTextChange(newText: string): void;
22
+ copyToClipboard(): void;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdCodeEditor, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdCodeEditor, "sd-code-editor", never, { "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; }, never, never, true, never>;
25
+ }
@@ -1,3 +1,4 @@
1
1
  export * from './src/components';
2
2
  export * from './src/document-builder.model';
3
3
  export * from './src/document-builder.component';
4
+ export * from './src/plugins/ck-comment/ck-comment.plugin.model';
@@ -1,6 +1,7 @@
1
1
  import { EventEmitter } from '@angular/core';
2
2
  import { ClassicEditor, ModelRange } from 'ckeditor5';
3
- import { SdDocumentBuilderComment, SdDocumentBuilderHeading, SdDocumentBuilderOption, SdDocumentBuilderVariable, SdEditorConfig } from './document-builder.model';
3
+ import { VariablePlugin, CkCommentPlugin } from './plugins';
4
+ import { SdDocumentBuilderHeading, SdDocumentBuilderOption, SdEditorConfig } from './document-builder.model';
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class SdDocumentBuilder {
6
7
  #private;
@@ -19,51 +20,19 @@ export declare class SdDocumentBuilder {
19
20
  getOrientation: () => "PORTRAIT" | "LANDSCAPE";
20
21
  scrollToTop(): void;
21
22
  heading: {
22
- all: () => SdDocumentBuilderHeading[];
23
- scroll: (id: string) => void;
24
- };
25
- comment: {
26
- /**
27
- * Lấy tất cả comments trong document
28
- * @returns Danh sách tất cả comments
29
- */
30
- all: () => SdDocumentBuilderComment[];
31
- /**
32
- * Thêm comment vào vùng text đang được chọn
33
- * @param comment - Dữ liệu comment
34
- * @param data - Dữ liệu extra data
35
- * @returns SdDocumentBuilderComment hoặc null nếu không có text được chọn
36
- */
37
- add: <T = any>(range: ModelRange, comment: string, data?: T) => SdDocumentBuilderComment<T> | null;
38
23
  /**
39
- * Cập nhật nội dung comment
40
- * @param markerId - ID của marker
41
- * @param commentData - Dữ liệu mới
42
- * @returns Comment đã cập nhật hoặc null
24
+ * Lấy tất cả headings trong document
25
+ * @returns Danh sách tất cả headings
43
26
  */
44
- update: <T = any>(markerId: string, comment: string, data?: T) => SdDocumentBuilderComment<T> | null;
45
- /**
46
- * Lấy chi tiết comment theo markerId
47
- * @param markerId - ID của marker
48
- * @returns Comment hoặc null
49
- */
50
- detail: (markerId: string) => SdDocumentBuilderComment | null;
51
- /**
52
- * Xóa comment theo markerId
53
- * @param markerId - ID của marker cần xóa
54
- * @returns true nếu xóa thành công, false nếu không tìm thấy
55
- */
56
- remove: (markerId: string) => boolean;
27
+ all: () => SdDocumentBuilderHeading[];
57
28
  /**
58
- * Scroll đến vị trí comment
59
- * @param markerId - ID của marker cần scroll tới
29
+ * Scroll tới vị trí của heading
30
+ * @param id - ID của heading cần scroll tới
60
31
  */
61
- scroll: (markerId: string) => void;
62
- };
63
- variable: {
64
- all: () => SdDocumentBuilderVariable[];
65
- scroll: (uuid: string) => void;
32
+ scroll: (id: string) => void;
66
33
  };
34
+ getCommentPluginAPI(): CkCommentPlugin | null;
35
+ getVariablePluginAPI(): VariablePlugin | null;
67
36
  /**
68
37
  * Xuất file Word có Header/Footer
69
38
  * @param fileName Tên file
@@ -77,6 +46,8 @@ export declare class SdDocumentBuilder {
77
46
  header?: string;
78
47
  footer?: string;
79
48
  }): void;
49
+ hightSelectRange: (range: ModelRange) => void;
50
+ removeHighlightSeclectRange: () => void;
80
51
  static ɵfac: i0.ɵɵFactoryDeclaration<SdDocumentBuilder, never>;
81
52
  static ɵcmp: i0.ɵɵComponentDeclaration<SdDocumentBuilder, "sd-document-builder", never, { "option": { "alias": "option"; "required": true; }; "_disabled": { "alias": "disabled"; "required": false; }; }, { "contentChange": "contentChange"; }, never, never, true, never>;
82
53
  }
@@ -1,13 +1,16 @@
1
- import { EditorConfig, EventInfo, ModelDocumentSelection, ModelRange } from 'ckeditor5';
1
+ import { EditorConfig, EventInfo, ModelDocumentSelection, ViewDataTransfer } from 'ckeditor5';
2
+ import { CkCommentConfig } from './plugins/ck-comment/ck-comment.plugin.model';
2
3
  export type SdEditorConfig = EditorConfig & {
3
4
  getOption?: () => SdDocumentBuilderOption;
4
5
  };
5
6
  export interface SdDocumentBuilderOption {
6
- onDropVariable?: (variable: SdDocumentBuilderVariable, dropIndex: number) => boolean | Promise<boolean | SdDocumentBuilderVariable>;
7
- onAddComment?: (range: ModelRange) => void;
8
- onSelectComment?: (markerId: string) => void;
7
+ onDropVariable?: (variable: SdDocumentBuilderVariable) => boolean | Promise<boolean | SdDocumentBuilderVariable>;
8
+ onAfterDropVariable?: (variable: SdDocumentBuilderVariable) => void;
9
+ onPasteVariable?: (display: string) => SdDocumentBuilderVariable | null | Promise<SdDocumentBuilderVariable | null>;
10
+ comment?: CkCommentConfig;
9
11
  onSelection?: (selection: ModelDocumentSelection, $event: EventInfo<string, unknown>) => void;
10
12
  onOrientation?: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void;
13
+ onPaste?: (data: SdPasteEventData) => void | Promise<void>;
11
14
  orientation?: 'PORTRAIT' | 'LANDSCAPE';
12
15
  }
13
16
  export interface SdDocumentBuilderVariable<T = any> {
@@ -15,13 +18,7 @@ export interface SdDocumentBuilderVariable<T = any> {
15
18
  uuid?: string;
16
19
  value: string;
17
20
  display: string;
18
- data?: T;
19
- }
20
- export interface SdDocumentBuilderComment<T = any> {
21
- markerId: string;
22
- selectedText: string;
23
- comment?: string;
24
- createdAt?: Date;
21
+ bindingValue?: string;
25
22
  data?: T;
26
23
  }
27
24
  export interface SdDocumentBuilderHeading {
@@ -30,3 +27,9 @@ export interface SdDocumentBuilderHeading {
30
27
  level: number;
31
28
  type: string;
32
29
  }
30
+ export interface SdPasteEventData {
31
+ html?: string;
32
+ text: string;
33
+ source: 'word' | 'excel' | 'google-docs' | 'web' | 'unknown';
34
+ dataTransfer: ViewDataTransfer;
35
+ }
@@ -0,0 +1,9 @@
1
+ import { Plugin } from 'ckeditor5';
2
+ /**
3
+ * Plugin để thêm margin-bottom: 4px cho các block elements
4
+ * (paragraph, heading, list, table) thông qua downcast conversion
5
+ */
6
+ export declare class BlockSpace extends Plugin {
7
+ static get pluginName(): string;
8
+ init(): void;
9
+ }
@@ -0,0 +1,44 @@
1
+ import { Plugin, ContextualBalloon } from 'ckeditor5';
2
+ import { CkComment, CkCommentConfig, CkCommentColors } from './ck-comment.plugin.model';
3
+ export declare class CkCommentPlugin extends Plugin {
4
+ #private;
5
+ static get pluginName(): string;
6
+ static get requires(): (typeof ContextualBalloon)[];
7
+ static readonly PENDING_MARKER_ID = "__pending_comment__";
8
+ static readonly DEFAULT_SEARCH_RANGE = 5;
9
+ static readonly DEFAULT_MAX_TEXT_LENGTH = 1000;
10
+ static readonly DEFAULT_COLORS: CkCommentColors;
11
+ init(): void;
12
+ /**
13
+ * Thiết lập config với callbacks
14
+ */
15
+ setConfig(config: CkCommentConfig): void;
16
+ /**
17
+ * Thêm comment và tạo marker
18
+ */
19
+ addComment(comment: CkComment): boolean;
20
+ /**
21
+ * Xóa comment theo id
22
+ */
23
+ removeComment(id: string | number): boolean;
24
+ /**
25
+ * Chọn comment theo id - chỉ thêm class highlight, không bôi đen text
26
+ */
27
+ selectComment(id: string | number, scrollIntoView?: boolean): void;
28
+ /**
29
+ * Thiết lập tất cả comments (khôi phục từ dữ liệu)
30
+ */
31
+ setComments(comments: CkComment[]): void;
32
+ /**
33
+ * Lấy tất cả comments
34
+ */
35
+ get comments(): CkComment[];
36
+ /**
37
+ * Thiết lập pending highlight cho selection (khi user đang nhập nội dung comment)
38
+ */
39
+ setPendingSelection(startPath: number[], endPath: number[]): boolean;
40
+ /**
41
+ * Xóa pending highlight và fire onCancelPending callback
42
+ */
43
+ clearPendingSelection(): void;
44
+ }
@@ -0,0 +1,57 @@
1
+ import { ModelRange } from 'ckeditor5';
2
+ /**
3
+ * Comment status based on text changes
4
+ */
5
+ export type CkCommentStatus = 'normal' | 'modified' | 'broken';
6
+ /**
7
+ * Color configuration for comment markers
8
+ */
9
+ export interface CkCommentColors {
10
+ marker?: string;
11
+ markerSelected?: string;
12
+ markerPending?: string;
13
+ markerModified?: string;
14
+ markerBroken?: string;
15
+ }
16
+ /**
17
+ * Comment data structure for CkCommentPlugin
18
+ */
19
+ export interface CkComment<T = any> {
20
+ id: string | number;
21
+ startPath: number[];
22
+ endPath: number[];
23
+ originalText: string;
24
+ currentText: string;
25
+ status: CkCommentStatus;
26
+ data?: T;
27
+ }
28
+ /**
29
+ * Config for CkCommentPlugin
30
+ */
31
+ export interface CkCommentConfig {
32
+ onPendingComment?: (comment: CkComment) => void;
33
+ onAddComment?: (comment: CkComment) => void;
34
+ onSelectComment?: (id: string | number) => void;
35
+ onRemoveComment?: (id: string | number) => void;
36
+ onChange?: (comments: CkComment[]) => void;
37
+ onCancelPending?: () => void;
38
+ onError?: (error: {
39
+ code: string;
40
+ message: string;
41
+ data?: any;
42
+ }) => void;
43
+ searchRange?: number;
44
+ debug?: boolean;
45
+ colors?: CkCommentColors;
46
+ maxTextLength?: number;
47
+ allowCreating?: boolean;
48
+ }
49
+ /**
50
+ * Data returned when user selects text for comment
51
+ */
52
+ export interface CkCommentSelection {
53
+ range: ModelRange;
54
+ startPath: number[];
55
+ endPath: number[];
56
+ text: string;
57
+ }