@worktile/theia 13.0.0-next.1 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/README.md +11 -11
  2. package/components/color-select/color-select.component.d.ts +32 -32
  3. package/components/color-select/color-select.component.scss +107 -107
  4. package/components/column-resize/column-resize-notifier.d.ts +35 -35
  5. package/components/column-resize/column-resize.directive.d.ts +26 -26
  6. package/components/column-resize/column-resize.module.d.ts +14 -14
  7. package/components/column-resize/event-dispatcher.d.ts +31 -31
  8. package/components/column-resize/overlay-handle.component.d.ts +33 -33
  9. package/components/column-resize/resize-ref.d.ts +25 -25
  10. package/components/column-resize/resizing.store.d.ts +28 -28
  11. package/components/column-resize/selectors.d.ts +3 -3
  12. package/components/contextmenu/contextmenu.component.d.ts +22 -22
  13. package/components/conversion-hint/conversion-hint.component.d.ts +18 -18
  14. package/components/conversion-hint/conversion-hint.component.scss +11 -11
  15. package/components/element/element.component.d.ts +7 -7
  16. package/components/inline-toolbar/inline-toolbar.component.d.ts +26 -26
  17. package/components/nav-split-line/nav-split-line.component.d.ts +13 -13
  18. package/components/table-select/table-select.component.d.ts +20 -20
  19. package/components/table-select/table-select.component.scss +35 -35
  20. package/components/template/template.component.d.ts +15 -15
  21. package/components/text/text.component.d.ts +14 -14
  22. package/components/toolbar/toolbar.component.d.ts +64 -64
  23. package/components/toolbar-dropdown/toolbar-dropdown.component.d.ts +33 -33
  24. package/components/toolbar-group/toolbar-group.component.d.ts +33 -33
  25. package/components/toolbar-group/toolbar-group.component.scss +17 -17
  26. package/components/toolbar-item/toolbar-item.component.d.ts +17 -17
  27. package/constants/auto-format-rules.d.ts +2 -2
  28. package/constants/code.d.ts +9 -9
  29. package/constants/color-select.d.ts +14 -14
  30. package/constants/default.d.ts +9 -9
  31. package/constants/error.d.ts +5 -5
  32. package/constants/index.d.ts +5 -5
  33. package/constants/node-types.d.ts +99 -99
  34. package/constants/selector.d.ts +2 -2
  35. package/constants/toolbar.d.ts +17 -17
  36. package/core/create-plugin.d.ts +2 -2
  37. package/core/create-toolbar.d.ts +5 -5
  38. package/core/index.d.ts +4 -4
  39. package/core/toolbar-item/base-toolbar-item.d.ts +29 -29
  40. package/core/utils/combine-plugins.d.ts +2 -2
  41. package/core/utils/flatten-deep-plugins.d.ts +6 -6
  42. package/core/utils/get-plugin-options.d.ts +2 -2
  43. package/core/utils/get-plugin.d.ts +2 -2
  44. package/core/utils/get-plugins.d.ts +2 -2
  45. package/core/utils/index.d.ts +10 -10
  46. package/core/utils/merge-array.d.ts +1 -1
  47. package/core/utils/merge-deep-plugins.d.ts +2 -2
  48. package/core/utils/merge-options.d.ts +2 -2
  49. package/core/utils/nested-structure-by-key.d.ts +2 -2
  50. package/core/utils/plugins-by-key.d.ts +2 -2
  51. package/core/with-theia.d.ts +4 -4
  52. package/custom-types.d.ts +131 -131
  53. package/editor.component.d.ts +92 -92
  54. package/editor.module.d.ts +100 -98
  55. package/esm2020/components/color-select/color-select.component.mjs +108 -108
  56. package/esm2020/components/column-resize/column-resize-notifier.mjs +31 -31
  57. package/esm2020/components/column-resize/column-resize.directive.mjs +98 -98
  58. package/esm2020/components/column-resize/column-resize.module.mjs +32 -32
  59. package/esm2020/components/column-resize/event-dispatcher.mjs +55 -55
  60. package/esm2020/components/column-resize/overlay-handle.component.mjs +139 -139
  61. package/esm2020/components/column-resize/resize-ref.mjs +25 -25
  62. package/esm2020/components/column-resize/resizing.store.mjs +154 -154
  63. package/esm2020/components/column-resize/selectors.mjs +4 -4
  64. package/esm2020/components/contextmenu/contextmenu.component.mjs +61 -61
  65. package/esm2020/components/conversion-hint/conversion-hint.component.mjs +54 -54
  66. package/esm2020/components/element/element.component.mjs +22 -22
  67. package/esm2020/components/inline-toolbar/inline-toolbar.component.mjs +125 -125
  68. package/esm2020/components/nav-split-line/nav-split-line.component.mjs +36 -36
  69. package/esm2020/components/table-select/table-select.component.mjs +49 -49
  70. package/esm2020/components/template/template.component.mjs +62 -62
  71. package/esm2020/components/text/text.component.mjs +57 -57
  72. package/esm2020/components/toolbar/toolbar.component.mjs +241 -241
  73. package/esm2020/components/toolbar-dropdown/toolbar-dropdown.component.mjs +128 -128
  74. package/esm2020/components/toolbar-group/toolbar-group.component.mjs +110 -110
  75. package/esm2020/components/toolbar-item/toolbar-item.component.mjs +60 -60
  76. package/esm2020/constants/auto-format-rules.mjs +166 -166
  77. package/esm2020/constants/code.mjs +88 -88
  78. package/esm2020/constants/color-select.mjs +61 -61
  79. package/esm2020/constants/default.mjs +9 -9
  80. package/esm2020/constants/error.mjs +7 -7
  81. package/esm2020/constants/index.mjs +5 -5
  82. package/esm2020/constants/node-types.mjs +132 -132
  83. package/esm2020/constants/selector.mjs +3 -3
  84. package/esm2020/constants/toolbar.mjs +69 -69
  85. package/esm2020/core/create-plugin.mjs +4 -4
  86. package/esm2020/core/create-toolbar.mjs +55 -55
  87. package/esm2020/core/index.mjs +4 -4
  88. package/esm2020/core/toolbar-item/base-toolbar-item.mjs +89 -89
  89. package/esm2020/core/utils/combine-plugins.mjs +9 -9
  90. package/esm2020/core/utils/flatten-deep-plugins.mjs +18 -18
  91. package/esm2020/core/utils/get-plugin-options.mjs +2 -2
  92. package/esm2020/core/utils/get-plugin.mjs +1 -1
  93. package/esm2020/core/utils/get-plugins.mjs +3 -3
  94. package/esm2020/core/utils/index.mjs +10 -10
  95. package/esm2020/core/utils/merge-array.mjs +17 -17
  96. package/esm2020/core/utils/merge-deep-plugins.mjs +13 -13
  97. package/esm2020/core/utils/merge-options.mjs +19 -19
  98. package/esm2020/core/utils/nested-structure-by-key.mjs +10 -10
  99. package/esm2020/core/utils/plugins-by-key.mjs +9 -9
  100. package/esm2020/core/with-theia.mjs +22 -22
  101. package/esm2020/custom-types.mjs +1 -1
  102. package/esm2020/editor.component.mjs +430 -430
  103. package/esm2020/editor.module.mjs +207 -201
  104. package/esm2020/interfaces/auto-format.mjs +1 -1
  105. package/esm2020/interfaces/editor.mjs +24 -24
  106. package/esm2020/interfaces/element.mjs +1 -1
  107. package/esm2020/interfaces/image.mjs +2 -2
  108. package/esm2020/interfaces/index.mjs +8 -8
  109. package/esm2020/interfaces/plugins/index.mjs +4 -4
  110. package/esm2020/interfaces/plugins/no-infer.mjs +1 -1
  111. package/esm2020/interfaces/plugins/plugin-key.mjs +39 -39
  112. package/esm2020/interfaces/plugins/plugins.mjs +1 -1
  113. package/esm2020/interfaces/plugins/with-override.mjs +1 -1
  114. package/esm2020/interfaces/reset-block-type-plugin-options.mjs +2 -2
  115. package/esm2020/interfaces/toolbar.mjs +11 -11
  116. package/esm2020/interfaces/upload.mjs +1 -1
  117. package/esm2020/interfaces/utility/index.mjs +3 -3
  118. package/esm2020/interfaces/utility/nested-structure-by-key.mjs +1 -1
  119. package/esm2020/interfaces/utility/override-by-key.mjs +1 -1
  120. package/esm2020/interfaces/utility/types.mjs +1 -1
  121. package/esm2020/interfaces/valid-children-types.mjs +35 -35
  122. package/esm2020/interfaces/view-base.mjs +21 -21
  123. package/esm2020/pipes.mjs +42 -42
  124. package/esm2020/plugins/align/align.editor.mjs +46 -46
  125. package/esm2020/plugins/align/align.plugin.mjs +63 -63
  126. package/esm2020/plugins/autoformat/autoformat.plugin.mjs +108 -108
  127. package/esm2020/plugins/autoformat/transforms/auto-format-block.mjs +14 -14
  128. package/esm2020/plugins/autoformat/transforms/auto-format-inline.mjs +77 -77
  129. package/esm2020/plugins/blockquote/blockquote.component.mjs +21 -21
  130. package/esm2020/plugins/blockquote/blockquote.editor.mjs +19 -19
  131. package/esm2020/plugins/blockquote/blockquote.plugin.mjs +70 -70
  132. package/esm2020/plugins/code/code.component.mjs +240 -240
  133. package/esm2020/plugins/code/code.editor.mjs +47 -47
  134. package/esm2020/plugins/code/code.plugin.mjs +41 -41
  135. package/esm2020/plugins/color/color.editor.mjs +43 -43
  136. package/esm2020/plugins/color/color.plugin.mjs +27 -27
  137. package/esm2020/plugins/color/toolbar-item.component.mjs +78 -78
  138. package/esm2020/plugins/common/auto-insert-data..mjs +76 -76
  139. package/esm2020/plugins/common/block-card.plugin.mjs +286 -286
  140. package/esm2020/plugins/common/get-fragment.plugin.mjs +23 -23
  141. package/esm2020/plugins/common/history.plugin.mjs +30 -30
  142. package/esm2020/plugins/common/move-selection.plugin.mjs +89 -89
  143. package/esm2020/plugins/common/remove-empty.plugin.mjs +59 -59
  144. package/esm2020/plugins/common/remove-void.plugin.mjs +56 -56
  145. package/esm2020/plugins/common/reset-type.plugin.mjs +34 -34
  146. package/esm2020/plugins/common/transforms.plugin.mjs +17 -17
  147. package/esm2020/plugins/deserializers/deserialize-html.plugin.mjs +38 -38
  148. package/esm2020/plugins/deserializers/deserialize-md.plugin.mjs +121 -121
  149. package/esm2020/plugins/font-size/font-size.editor.mjs +97 -97
  150. package/esm2020/plugins/heading/heading.editor.mjs +53 -53
  151. package/esm2020/plugins/heading/heading.plugin.mjs +84 -84
  152. package/esm2020/plugins/hr/hr.component.mjs +40 -40
  153. package/esm2020/plugins/hr/hr.editor.mjs +7 -7
  154. package/esm2020/plugins/hr/hr.plugin.mjs +41 -41
  155. package/esm2020/plugins/image/image.component.mjs +385 -365
  156. package/esm2020/plugins/image/image.editor.mjs +57 -57
  157. package/esm2020/plugins/image/image.plugin.mjs +56 -56
  158. package/esm2020/plugins/indent/indent.editor.mjs +70 -70
  159. package/esm2020/plugins/indent/indent.plugin.mjs +57 -57
  160. package/esm2020/plugins/indent/on-keydown-indent.mjs +53 -53
  161. package/esm2020/plugins/index.mjs +70 -70
  162. package/esm2020/plugins/inline-code/inline-code.component.mjs +21 -21
  163. package/esm2020/plugins/inline-code/inline-code.editor.mjs +47 -47
  164. package/esm2020/plugins/inline-code/inline-code.plugin.mjs +65 -65
  165. package/esm2020/plugins/link/edit/link-edit.component.mjs +105 -105
  166. package/esm2020/plugins/link/hover/link-hover.component.mjs +36 -36
  167. package/esm2020/plugins/link/link.component.mjs +162 -162
  168. package/esm2020/plugins/link/link.editor.mjs +66 -66
  169. package/esm2020/plugins/link/link.plugin.mjs +58 -58
  170. package/esm2020/plugins/link/link.types.mjs +12 -12
  171. package/esm2020/plugins/list/components/bulleted-list.component.mjs +32 -32
  172. package/esm2020/plugins/list/components/list-item.component.mjs +92 -92
  173. package/esm2020/plugins/list/components/numbered-list.component.mjs +38 -38
  174. package/esm2020/plugins/list/list.editor.mjs +125 -125
  175. package/esm2020/plugins/list/list.plugin.mjs +285 -285
  176. package/esm2020/plugins/list/normalizers/get-list-normalizer.mjs +39 -39
  177. package/esm2020/plugins/list/normalizers/normalize-list-item.mjs +18 -18
  178. package/esm2020/plugins/list/normalizers/normalize-no.mjs +42 -42
  179. package/esm2020/plugins/list/on-key-down-list.mjs +32 -32
  180. package/esm2020/plugins/list/queries/get-list-item-entry.mjs +27 -27
  181. package/esm2020/plugins/list/queries/get-list-item-sublist.mjs +12 -12
  182. package/esm2020/plugins/list/queries/get-list-types.mjs +5 -5
  183. package/esm2020/plugins/list/queries/get-start-list-item.mjs +26 -26
  184. package/esm2020/plugins/list/queries/has-list-in-list-item.mjs +27 -27
  185. package/esm2020/plugins/list/queries/is-in-list.mjs +5 -5
  186. package/esm2020/plugins/list/queries/is-list-nested.mjs +10 -10
  187. package/esm2020/plugins/list/queries/is-list.mjs +5 -5
  188. package/esm2020/plugins/list/queries/is-node-type-list.mjs +4 -4
  189. package/esm2020/plugins/list/queries/is-selection-at-list-item-start.mjs +12 -12
  190. package/esm2020/plugins/list/queries/is-selection-in-same-list-item.mjs +16 -16
  191. package/esm2020/plugins/list/queries/is-single-list-item.mjs +9 -9
  192. package/esm2020/plugins/list/transforms/insert-list-data.mjs +71 -71
  193. package/esm2020/plugins/list/transforms/insert-list-item.mjs +72 -72
  194. package/esm2020/plugins/list/transforms/move-list-item-down.mjs +41 -41
  195. package/esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +42 -42
  196. package/esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +29 -29
  197. package/esm2020/plugins/list/transforms/move-list-item-up.mjs +77 -77
  198. package/esm2020/plugins/list/transforms/unwrap-list.mjs +9 -9
  199. package/esm2020/plugins/list/types.mjs +2 -2
  200. package/esm2020/plugins/mark/mark.editor.mjs +27 -27
  201. package/esm2020/plugins/mark/mark.plugin.mjs +104 -104
  202. package/esm2020/plugins/node-id/node-id.plugin.mjs +77 -77
  203. package/esm2020/plugins/normalizers/insert-paragraph-nodes.mjs +27 -27
  204. package/esm2020/plugins/normalizers/remove-empty-nodes.mjs +17 -17
  205. package/esm2020/plugins/normalizers/trailing-node.plugin.mjs +32 -32
  206. package/esm2020/plugins/paint-format/paint-format.editor.mjs +122 -122
  207. package/esm2020/plugins/public-api.mjs +15 -15
  208. package/esm2020/plugins/quick-insert/components/quick-insert.component.mjs +95 -95
  209. package/esm2020/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.mjs +79 -79
  210. package/esm2020/plugins/quick-insert/quick-insert.editor.mjs +52 -52
  211. package/esm2020/plugins/quick-insert/quick-insert.plugin.mjs +73 -73
  212. package/esm2020/plugins/soft-break/soft-break.plugin.mjs +35 -35
  213. package/esm2020/plugins/soft-break/soft-break.types.mjs +1 -1
  214. package/esm2020/plugins/table/components/insert-mark/insert-mark.component.mjs +99 -99
  215. package/esm2020/plugins/table/components/row/row.component.mjs +46 -46
  216. package/esm2020/plugins/table/components/table.component.mjs +460 -460
  217. package/esm2020/plugins/table/components/td/td.component.mjs +696 -696
  218. package/esm2020/plugins/table/components/toolbar/table-options.component.mjs +70 -70
  219. package/esm2020/plugins/table/components/toolbar/table-toolbar.component.mjs +158 -158
  220. package/esm2020/plugins/table/table.editor.mjs +182 -182
  221. package/esm2020/plugins/table/table.plugin.mjs +426 -426
  222. package/esm2020/plugins/table/table.service.mjs +102 -102
  223. package/esm2020/plugins/table/table.store.mjs +483 -483
  224. package/esm2020/plugins/table/table.types.mjs +33 -33
  225. package/esm2020/plugins/table/toolbar-item.component.mjs +60 -60
  226. package/esm2020/plugins/table/transforms/clear-cell.mjs +14 -14
  227. package/esm2020/plugins/table/transforms/clear-table-node.mjs +27 -27
  228. package/esm2020/plugins/table/transforms/insert-column.mjs +57 -57
  229. package/esm2020/plugins/table/transforms/insert-row.mjs +42 -42
  230. package/esm2020/plugins/table/transforms/insert-table.mjs +14 -14
  231. package/esm2020/plugins/table/transforms/remove-column.mjs +51 -51
  232. package/esm2020/plugins/table/transforms/remove-row.mjs +50 -50
  233. package/esm2020/plugins/table/transforms/remove-table.mjs +49 -49
  234. package/esm2020/plugins/table/utils/add-columns.mjs +28 -28
  235. package/esm2020/plugins/table/utils/calc-anchor-position.mjs +24 -24
  236. package/esm2020/plugins/table/utils/calc-span.mjs +72 -72
  237. package/esm2020/plugins/table/utils/create-cell.mjs +19 -19
  238. package/esm2020/plugins/table/utils/create-row.mjs +12 -12
  239. package/esm2020/plugins/table/utils/create-table.mjs +13 -13
  240. package/esm2020/plugins/table/utils/get-base-height.mjs +22 -22
  241. package/esm2020/plugins/table/utils/get-select-cell-node.mjs +19 -19
  242. package/esm2020/plugins/table/utils/index.mjs +8 -8
  243. package/esm2020/plugins/table/utils/is-range-in-table.mjs +16 -16
  244. package/esm2020/plugins/table/utils/is-selection-in-table.mjs +11 -11
  245. package/esm2020/plugins/table/utils/is-virtual-key.mjs +12 -12
  246. package/esm2020/plugins/table/utils/merge-cell.mjs +90 -90
  247. package/esm2020/plugins/table/utils/next-path.mjs +5 -5
  248. package/esm2020/plugins/table/utils/normalize-table.mjs +30 -30
  249. package/esm2020/plugins/table/utils/remove-columns.mjs +23 -23
  250. package/esm2020/plugins/table/utils/set-menu-cell-invisibility.mjs +15 -15
  251. package/esm2020/plugins/table/utils/split-cell.mjs +31 -31
  252. package/esm2020/plugins/table/utils/table-position.mjs +242 -242
  253. package/esm2020/plugins/todo-item/todo-item.component.mjs +53 -53
  254. package/esm2020/plugins/todo-item/todo-item.editor.mjs +31 -31
  255. package/esm2020/plugins/todo-item/todo-item.plugin.mjs +78 -78
  256. package/esm2020/plugins/vertical-align/toolbar-item.component.mjs +82 -82
  257. package/esm2020/plugins/vertical-align/vertical-align.editor.mjs +54 -54
  258. package/esm2020/public-api.mjs +23 -23
  259. package/esm2020/queries/anchor-block-entry.mjs +13 -13
  260. package/esm2020/queries/anchor-block.mjs +6 -6
  261. package/esm2020/queries/anchor-inline-entry.mjs +10 -10
  262. package/esm2020/queries/find-descendant.mjs +47 -47
  263. package/esm2020/queries/find-node.mjs +45 -45
  264. package/esm2020/queries/find-path.mjs +28 -28
  265. package/esm2020/queries/get-above-by-type.mjs +13 -13
  266. package/esm2020/queries/get-above.mjs +9 -9
  267. package/esm2020/queries/get-anchor-block-entry.mjs +8 -8
  268. package/esm2020/queries/get-block-above.mjs +10 -10
  269. package/esm2020/queries/get-block-card-above.mjs +10 -10
  270. package/esm2020/queries/get-block-card-cursor.mjs +5 -5
  271. package/esm2020/queries/get-container-blocks.mjs +11 -11
  272. package/esm2020/queries/get-directly-parent.mjs +11 -11
  273. package/esm2020/queries/get-insert-elements-path.mjs +43 -43
  274. package/esm2020/queries/get-last-child-path.mjs +9 -9
  275. package/esm2020/queries/get-last-node.mjs +17 -17
  276. package/esm2020/queries/get-next-sibling-nodes.mjs +17 -17
  277. package/esm2020/queries/get-node.mjs +10 -10
  278. package/esm2020/queries/get-nodes-by-type.mjs +15 -15
  279. package/esm2020/queries/get-nodes.mjs +7 -7
  280. package/esm2020/queries/get-parent.mjs +12 -12
  281. package/esm2020/queries/get-plain-text.mjs +16 -16
  282. package/esm2020/queries/get-plugin-by-toolbar.mjs +12 -12
  283. package/esm2020/queries/get-point-before.mjs +61 -61
  284. package/esm2020/queries/get-point-from-location.mjs +15 -15
  285. package/esm2020/queries/get-previous-path.mjs +9 -9
  286. package/esm2020/queries/get-rang-from-block-start.mjs +16 -16
  287. package/esm2020/queries/get-range-before.mjs +17 -17
  288. package/esm2020/queries/get-selection-marks.mjs +18 -18
  289. package/esm2020/queries/get-selection-nodes-by-type.mjs +29 -29
  290. package/esm2020/queries/get-text.mjs +9 -9
  291. package/esm2020/queries/get-toolbar-disabled.mjs +12 -12
  292. package/esm2020/queries/index.mjs +58 -58
  293. package/esm2020/queries/is-across-blocks.mjs +7 -7
  294. package/esm2020/queries/is-ancestor-empty.mjs +6 -6
  295. package/esm2020/queries/is-ancestor.mjs +3 -3
  296. package/esm2020/queries/is-block-above-empty.mjs +11 -11
  297. package/esm2020/queries/is-block-active.mjs +7 -7
  298. package/esm2020/queries/is-block-card-cursor.mjs +4 -4
  299. package/esm2020/queries/is-block-text-empty-after-selection.mjs +31 -31
  300. package/esm2020/queries/is-collapsed.mjs +7 -7
  301. package/esm2020/queries/is-contain-nested-type.mjs +28 -28
  302. package/esm2020/queries/is-container-type.mjs +2 -2
  303. package/esm2020/queries/is-descendant.mjs +3 -3
  304. package/esm2020/queries/is-empty-content.mjs +14 -14
  305. package/esm2020/queries/is-empty-paragraph-by-path.mjs +7 -7
  306. package/esm2020/queries/is-empty-paragraph.mjs +11 -11
  307. package/esm2020/queries/is-first-child.mjs +5 -5
  308. package/esm2020/queries/is-include-types.mjs +11 -11
  309. package/esm2020/queries/is-node-type-in.mjs +9 -9
  310. package/esm2020/queries/is-node-type.mjs +15 -15
  311. package/esm2020/queries/is-paragraph.mjs +9 -9
  312. package/esm2020/queries/is-point-at-root.mjs +2 -2
  313. package/esm2020/queries/is-range-across-blocks.mjs +22 -22
  314. package/esm2020/queries/is-range-at-root.mjs +3 -3
  315. package/esm2020/queries/is-start.mjs +6 -6
  316. package/esm2020/queries/some-node.mjs +9 -9
  317. package/esm2020/services/color-select.service.mjs +49 -49
  318. package/esm2020/services/context.service.mjs +58 -58
  319. package/esm2020/services/table-contextmenu.service.mjs +189 -189
  320. package/esm2020/services/toolbar.service.mjs +47 -47
  321. package/esm2020/shortcuts/index.mjs +5 -5
  322. package/esm2020/shortcuts/mark.mjs +24 -24
  323. package/esm2020/transforms/apply-deep-to-nodes.mjs +21 -21
  324. package/esm2020/transforms/clear-marks.mjs +23 -23
  325. package/esm2020/transforms/close-conversion-hint.mjs +8 -8
  326. package/esm2020/transforms/delete-element.mjs +11 -11
  327. package/esm2020/transforms/handle-continual-delete-backward.mjs +17 -17
  328. package/esm2020/transforms/handle-continual-insert-break.mjs +19 -19
  329. package/esm2020/transforms/index.mjs +18 -18
  330. package/esm2020/transforms/insert-elements.mjs +33 -33
  331. package/esm2020/transforms/insert-paragraph.mjs +6 -6
  332. package/esm2020/transforms/merge-deep-to-nodes.mjs +8 -8
  333. package/esm2020/transforms/move-children.mjs +21 -21
  334. package/esm2020/transforms/on-keydown-reset-block-type.mjs +22 -22
  335. package/esm2020/transforms/set-end-selection.mjs +10 -10
  336. package/esm2020/transforms/set-marks.mjs +9 -9
  337. package/esm2020/transforms/set-node.mjs +5 -5
  338. package/esm2020/transforms/split-node.mjs +31 -31
  339. package/esm2020/transforms/un-hang-range.mjs +11 -11
  340. package/esm2020/transforms/un-wrap.mjs +11 -11
  341. package/esm2020/transforms/unwrap-nodes-by-type.mjs +14 -14
  342. package/esm2020/utils/auto-focus.mjs +13 -13
  343. package/esm2020/utils/auto-scroll-view.mjs +24 -24
  344. package/esm2020/utils/cast-array.mjs +7 -7
  345. package/esm2020/utils/common.mjs +2 -2
  346. package/esm2020/utils/create-empty-paragraph.mjs +14 -14
  347. package/esm2020/utils/data-transform.mjs +48 -48
  348. package/esm2020/utils/dom.mjs +46 -46
  349. package/esm2020/utils/editor-uuid.mjs +8 -8
  350. package/esm2020/utils/fragment.mjs +65 -65
  351. package/esm2020/utils/get-all-nodes-by-type.mjs +5 -0
  352. package/esm2020/utils/get-editable-element-height.mjs +6 -6
  353. package/esm2020/utils/get-toolbar-class.mjs +6 -6
  354. package/esm2020/utils/id-creator.mjs +11 -11
  355. package/esm2020/utils/index.mjs +13 -13
  356. package/esm2020/utils/is-clean-empty-paragraph.mjs +36 -36
  357. package/esm2020/utils/is-inline.mjs +8 -8
  358. package/esm2020/utils/lodash.mjs +2 -2
  359. package/esm2020/utils/match.mjs +32 -32
  360. package/esm2020/utils/merge-element-options.mjs +19 -19
  361. package/esm2020/utils/weak-maps.mjs +3 -3
  362. package/esm2020/worktile-theia.mjs +4 -4
  363. package/fesm2015/worktile-theia.mjs +13131 -13097
  364. package/fesm2015/worktile-theia.mjs.map +1 -1
  365. package/fesm2020/worktile-theia.mjs +13150 -13120
  366. package/fesm2020/worktile-theia.mjs.map +1 -1
  367. package/interfaces/auto-format.d.ts +64 -64
  368. package/interfaces/editor.d.ts +146 -146
  369. package/interfaces/element.d.ts +9 -9
  370. package/interfaces/image.d.ts +25 -25
  371. package/interfaces/index.d.ts +8 -8
  372. package/interfaces/plugins/index.d.ts +4 -4
  373. package/interfaces/plugins/no-infer.d.ts +1 -1
  374. package/interfaces/plugins/plugin-key.d.ts +48 -48
  375. package/interfaces/plugins/plugins.d.ts +45 -45
  376. package/interfaces/plugins/with-override.d.ts +7 -7
  377. package/interfaces/reset-block-type-plugin-options.d.ts +23 -23
  378. package/interfaces/toolbar.d.ts +64 -64
  379. package/interfaces/upload.d.ts +11 -11
  380. package/interfaces/utility/index.d.ts +3 -3
  381. package/interfaces/utility/nested-structure-by-key.d.ts +3 -3
  382. package/interfaces/utility/override-by-key.d.ts +3 -3
  383. package/interfaces/utility/types.d.ts +1 -1
  384. package/interfaces/valid-children-types.d.ts +9 -9
  385. package/interfaces/view-base.d.ts +9 -9
  386. package/package.json +5 -4
  387. package/pipes.d.ts +16 -16
  388. package/plugins/align/align.editor.d.ts +7 -7
  389. package/plugins/align/align.plugin.d.ts +2 -2
  390. package/plugins/autoformat/autoformat.plugin.d.ts +6 -6
  391. package/plugins/autoformat/transforms/auto-format-block.d.ts +5 -5
  392. package/plugins/autoformat/transforms/auto-format-inline.d.ts +9 -9
  393. package/plugins/blockquote/blockquote.component.d.ts +11 -11
  394. package/plugins/blockquote/blockquote.editor.d.ts +4 -4
  395. package/plugins/blockquote/blockquote.plugin.d.ts +2 -2
  396. package/plugins/code/code.component.d.ts +65 -65
  397. package/plugins/code/code.editor.d.ts +8 -8
  398. package/plugins/code/code.plugin.d.ts +2 -2
  399. package/plugins/color/color.editor.d.ts +8 -8
  400. package/plugins/color/color.plugin.d.ts +1 -1
  401. package/plugins/color/toolbar-item.component.d.ts +16 -16
  402. package/plugins/common/auto-insert-data..d.ts +2 -2
  403. package/plugins/common/block-card.plugin.d.ts +2 -2
  404. package/plugins/common/get-fragment.plugin.d.ts +6 -6
  405. package/plugins/common/history.plugin.d.ts +9 -9
  406. package/plugins/common/move-selection.plugin.d.ts +2 -2
  407. package/plugins/common/remove-empty.plugin.d.ts +2 -2
  408. package/plugins/common/remove-void.plugin.d.ts +2 -2
  409. package/plugins/common/reset-type.plugin.d.ts +2 -2
  410. package/plugins/common/transforms.plugin.d.ts +8 -8
  411. package/plugins/deserializers/deserialize-html.plugin.d.ts +2 -2
  412. package/plugins/deserializers/deserialize-md.plugin.d.ts +2 -2
  413. package/plugins/font-size/font-size.editor.d.ts +10 -10
  414. package/plugins/heading/heading.editor.d.ts +9 -9
  415. package/plugins/heading/heading.plugin.d.ts +7 -7
  416. package/plugins/hr/hr.component.d.ts +12 -12
  417. package/plugins/hr/hr.editor.d.ts +4 -4
  418. package/plugins/hr/hr.plugin.d.ts +2 -2
  419. package/plugins/image/image.component.d.ts +77 -74
  420. package/plugins/image/image.editor.d.ts +12 -12
  421. package/plugins/image/image.plugin.d.ts +7 -7
  422. package/plugins/indent/indent.editor.d.ts +10 -10
  423. package/plugins/indent/indent.plugin.d.ts +8 -8
  424. package/plugins/indent/on-keydown-indent.d.ts +3 -3
  425. package/plugins/index.d.ts +1 -1
  426. package/plugins/inline-code/inline-code.component.d.ts +9 -9
  427. package/plugins/inline-code/inline-code.editor.d.ts +7 -7
  428. package/plugins/inline-code/inline-code.plugin.d.ts +2 -2
  429. package/plugins/link/edit/link-edit.component.d.ts +36 -36
  430. package/plugins/link/hover/link-hover.component.d.ts +15 -15
  431. package/plugins/link/link.component.d.ts +39 -39
  432. package/plugins/link/link.editor.d.ts +7 -7
  433. package/plugins/link/link.plugin.d.ts +2 -2
  434. package/plugins/link/link.types.d.ts +9 -9
  435. package/plugins/list/components/bulleted-list.component.d.ts +15 -15
  436. package/plugins/list/components/list-item.component.d.ts +20 -20
  437. package/plugins/list/components/numbered-list.component.d.ts +16 -16
  438. package/plugins/list/list.editor.d.ts +12 -12
  439. package/plugins/list/list.plugin.d.ts +3 -3
  440. package/plugins/list/normalizers/get-list-normalizer.d.ts +6 -6
  441. package/plugins/list/normalizers/normalize-list-item.d.ts +5 -5
  442. package/plugins/list/normalizers/normalize-no.d.ts +2 -2
  443. package/plugins/list/on-key-down-list.d.ts +2 -2
  444. package/plugins/list/queries/get-list-item-entry.d.ts +10 -10
  445. package/plugins/list/queries/get-list-item-sublist.d.ts +6 -6
  446. package/plugins/list/queries/get-list-types.d.ts +2 -2
  447. package/plugins/list/queries/get-start-list-item.d.ts +8 -8
  448. package/plugins/list/queries/has-list-in-list-item.d.ts +15 -15
  449. package/plugins/list/queries/is-in-list.d.ts +2 -2
  450. package/plugins/list/queries/is-list-nested.d.ts +5 -5
  451. package/plugins/list/queries/is-list.d.ts +2 -2
  452. package/plugins/list/queries/is-node-type-list.d.ts +2 -2
  453. package/plugins/list/queries/is-selection-at-list-item-start.d.ts +5 -5
  454. package/plugins/list/queries/is-selection-in-same-list-item.d.ts +5 -5
  455. package/plugins/list/queries/is-single-list-item.d.ts +5 -5
  456. package/plugins/list/transforms/insert-list-data.d.ts +12 -12
  457. package/plugins/list/transforms/insert-list-item.d.ts +5 -5
  458. package/plugins/list/transforms/move-list-item-down.d.ts +6 -6
  459. package/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.d.ts +20 -20
  460. package/plugins/list/transforms/move-list-item-sublist-items-to-list.d.ts +19 -19
  461. package/plugins/list/transforms/move-list-item-up.d.ts +10 -10
  462. package/plugins/list/transforms/unwrap-list.d.ts +2 -2
  463. package/plugins/list/types.d.ts +7 -7
  464. package/plugins/mark/mark.editor.d.ts +8 -8
  465. package/plugins/mark/mark.plugin.d.ts +3 -3
  466. package/plugins/node-id/node-id.plugin.d.ts +8 -8
  467. package/plugins/normalizers/insert-paragraph-nodes.d.ts +7 -7
  468. package/plugins/normalizers/remove-empty-nodes.d.ts +7 -7
  469. package/plugins/normalizers/trailing-node.plugin.d.ts +9 -9
  470. package/plugins/paint-format/paint-format.editor.d.ts +8 -8
  471. package/plugins/public-api.d.ts +15 -15
  472. package/plugins/quick-insert/components/quick-insert.component.d.ts +28 -28
  473. package/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.d.ts +28 -28
  474. package/plugins/quick-insert/quick-insert.editor.d.ts +7 -7
  475. package/plugins/quick-insert/quick-insert.plugin.d.ts +10 -10
  476. package/plugins/soft-break/soft-break.plugin.d.ts +5 -5
  477. package/plugins/soft-break/soft-break.types.d.ts +8 -8
  478. package/plugins/table/components/insert-mark/insert-mark.component.d.ts +24 -24
  479. package/plugins/table/components/row/row.component.d.ts +14 -14
  480. package/plugins/table/components/table.component.d.ts +79 -79
  481. package/plugins/table/components/td/td.component.d.ts +95 -95
  482. package/plugins/table/components/toolbar/table-options.component.d.ts +20 -20
  483. package/plugins/table/components/toolbar/table-toolbar.component.d.ts +38 -38
  484. package/plugins/table/table.editor.d.ts +25 -25
  485. package/plugins/table/table.plugin.d.ts +3 -3
  486. package/plugins/table/table.service.d.ts +30 -30
  487. package/plugins/table/table.store.d.ts +71 -71
  488. package/plugins/table/table.types.d.ts +67 -67
  489. package/plugins/table/toolbar-item.component.d.ts +17 -17
  490. package/plugins/table/transforms/clear-cell.d.ts +6 -6
  491. package/plugins/table/transforms/clear-table-node.d.ts +6 -6
  492. package/plugins/table/transforms/insert-column.d.ts +12 -12
  493. package/plugins/table/transforms/insert-row.d.ts +6 -6
  494. package/plugins/table/transforms/insert-table.d.ts +6 -6
  495. package/plugins/table/transforms/remove-column.d.ts +3 -3
  496. package/plugins/table/transforms/remove-row.d.ts +3 -3
  497. package/plugins/table/transforms/remove-table.d.ts +3 -3
  498. package/plugins/table/utils/add-columns.d.ts +2 -2
  499. package/plugins/table/utils/calc-anchor-position.d.ts +6 -6
  500. package/plugins/table/utils/calc-span.d.ts +11 -11
  501. package/plugins/table/utils/create-cell.d.ts +16 -16
  502. package/plugins/table/utils/create-row.d.ts +7 -7
  503. package/plugins/table/utils/create-table.d.ts +7 -7
  504. package/plugins/table/utils/get-base-height.d.ts +9 -9
  505. package/plugins/table/utils/get-select-cell-node.d.ts +7 -7
  506. package/plugins/table/utils/index.d.ts +7 -7
  507. package/plugins/table/utils/is-range-in-table.d.ts +6 -6
  508. package/plugins/table/utils/is-selection-in-table.d.ts +6 -6
  509. package/plugins/table/utils/is-virtual-key.d.ts +1 -1
  510. package/plugins/table/utils/merge-cell.d.ts +21 -21
  511. package/plugins/table/utils/next-path.d.ts +2 -2
  512. package/plugins/table/utils/normalize-table.d.ts +2 -2
  513. package/plugins/table/utils/remove-columns.d.ts +2 -2
  514. package/plugins/table/utils/set-menu-cell-invisibility.d.ts +3 -3
  515. package/plugins/table/utils/split-cell.d.ts +4 -4
  516. package/plugins/table/utils/table-position.d.ts +97 -97
  517. package/plugins/todo-item/todo-item.component.d.ts +21 -21
  518. package/plugins/todo-item/todo-item.editor.d.ts +5 -5
  519. package/plugins/todo-item/todo-item.plugin.d.ts +5 -5
  520. package/plugins/vertical-align/toolbar-item.component.d.ts +25 -25
  521. package/plugins/vertical-align/vertical-align.editor.d.ts +7 -7
  522. package/public-api.d.ts +20 -20
  523. package/queries/anchor-block-entry.d.ts +2 -2
  524. package/queries/anchor-block.d.ts +2 -2
  525. package/queries/anchor-inline-entry.d.ts +2 -2
  526. package/queries/find-descendant.d.ts +10 -10
  527. package/queries/find-node.d.ts +15 -15
  528. package/queries/find-path.d.ts +6 -6
  529. package/queries/get-above-by-type.d.ts +6 -6
  530. package/queries/get-above.d.ts +6 -6
  531. package/queries/get-anchor-block-entry.d.ts +2 -2
  532. package/queries/get-block-above.d.ts +7 -7
  533. package/queries/get-block-card-above.d.ts +7 -7
  534. package/queries/get-block-card-cursor.d.ts +2 -2
  535. package/queries/get-container-blocks.d.ts +2 -2
  536. package/queries/get-directly-parent.d.ts +2 -2
  537. package/queries/get-insert-elements-path.d.ts +7 -7
  538. package/queries/get-last-child-path.d.ts +6 -6
  539. package/queries/get-last-node.d.ts +2 -2
  540. package/queries/get-next-sibling-nodes.d.ts +7 -7
  541. package/queries/get-node.d.ts +2 -2
  542. package/queries/get-nodes-by-type.d.ts +6 -6
  543. package/queries/get-nodes.d.ts +4 -4
  544. package/queries/get-parent.d.ts +7 -7
  545. package/queries/get-plain-text.d.ts +6 -6
  546. package/queries/get-plugin-by-toolbar.d.ts +3 -3
  547. package/queries/get-point-before.d.ts +38 -38
  548. package/queries/get-point-from-location.d.ts +5 -5
  549. package/queries/get-previous-path.d.ts +2 -2
  550. package/queries/get-rang-from-block-start.d.ts +9 -9
  551. package/queries/get-range-before.d.ts +7 -7
  552. package/queries/get-selection-marks.d.ts +12 -12
  553. package/queries/get-selection-nodes-by-type.d.ts +3 -3
  554. package/queries/get-text.d.ts +6 -6
  555. package/queries/get-toolbar-disabled.d.ts +4 -4
  556. package/queries/index.d.ts +58 -58
  557. package/queries/is-across-blocks.d.ts +2 -2
  558. package/queries/is-ancestor-empty.d.ts +5 -5
  559. package/queries/is-ancestor.d.ts +2 -2
  560. package/queries/is-block-above-empty.d.ts +5 -5
  561. package/queries/is-block-active.d.ts +3 -3
  562. package/queries/is-block-card-cursor.d.ts +2 -2
  563. package/queries/is-block-text-empty-after-selection.d.ts +7 -7
  564. package/queries/is-collapsed.d.ts +6 -6
  565. package/queries/is-contain-nested-type.d.ts +2 -2
  566. package/queries/is-container-type.d.ts +2 -2
  567. package/queries/is-descendant.d.ts +2 -2
  568. package/queries/is-empty-content.d.ts +2 -2
  569. package/queries/is-empty-paragraph-by-path.d.ts +2 -2
  570. package/queries/is-empty-paragraph.d.ts +2 -2
  571. package/queries/is-first-child.d.ts +5 -5
  572. package/queries/is-include-types.d.ts +3 -3
  573. package/queries/is-node-type-in.d.ts +6 -6
  574. package/queries/is-node-type.d.ts +6 -6
  575. package/queries/is-paragraph.d.ts +2 -2
  576. package/queries/is-point-at-root.d.ts +2 -2
  577. package/queries/is-range-across-blocks.d.ts +8 -8
  578. package/queries/is-range-at-root.d.ts +2 -2
  579. package/queries/is-start.d.ts +5 -5
  580. package/queries/some-node.d.ts +7 -7
  581. package/services/color-select.service.d.ts +20 -20
  582. package/services/context.service.d.ts +49 -49
  583. package/services/table-contextmenu.service.d.ts +25 -25
  584. package/services/toolbar.service.d.ts +9 -9
  585. package/shortcuts/index.d.ts +2 -2
  586. package/shortcuts/mark.d.ts +2 -2
  587. package/transforms/apply-deep-to-nodes.d.ts +12 -12
  588. package/transforms/clear-marks.d.ts +2 -2
  589. package/transforms/close-conversion-hint.d.ts +2 -2
  590. package/transforms/delete-element.d.ts +2 -2
  591. package/transforms/handle-continual-delete-backward.d.ts +3 -3
  592. package/transforms/handle-continual-insert-break.d.ts +3 -3
  593. package/transforms/index.d.ts +18 -18
  594. package/transforms/insert-elements.d.ts +2 -2
  595. package/transforms/insert-paragraph.d.ts +2 -2
  596. package/transforms/merge-deep-to-nodes.d.ts +5 -5
  597. package/transforms/move-children.d.ts +24 -24
  598. package/transforms/on-keydown-reset-block-type.d.ts +3 -3
  599. package/transforms/set-end-selection.d.ts +2 -2
  600. package/transforms/set-marks.d.ts +12 -12
  601. package/transforms/set-node.d.ts +2 -2
  602. package/transforms/split-node.d.ts +3 -3
  603. package/transforms/un-hang-range.d.ts +10 -10
  604. package/transforms/un-wrap.d.ts +3 -3
  605. package/transforms/unwrap-nodes-by-type.d.ts +6 -6
  606. package/utils/auto-focus.d.ts +2 -2
  607. package/utils/auto-scroll-view.d.ts +6 -6
  608. package/utils/cast-array.d.ts +1 -1
  609. package/utils/common.d.ts +2 -2
  610. package/utils/create-empty-paragraph.d.ts +2 -2
  611. package/utils/data-transform.d.ts +6 -6
  612. package/utils/dom.d.ts +10 -10
  613. package/utils/editor-uuid.d.ts +3 -3
  614. package/utils/fragment.d.ts +10 -10
  615. package/utils/get-all-nodes-by-type.d.ts +3 -0
  616. package/utils/get-editable-element-height.d.ts +2 -2
  617. package/utils/get-toolbar-class.d.ts +2 -2
  618. package/utils/id-creator.d.ts +1 -1
  619. package/utils/index.d.ts +13 -13
  620. package/utils/is-clean-empty-paragraph.d.ts +9 -9
  621. package/utils/is-inline.d.ts +2 -2
  622. package/utils/lodash.d.ts +2 -2
  623. package/utils/match.d.ts +18 -18
  624. package/utils/merge-element-options.d.ts +2 -2
  625. package/utils/weak-maps.d.ts +5 -5
  626. package/worktile-theia.d.ts +5 -5
@@ -1,241 +1,241 @@
1
- import { Component, Input, ViewChild, ViewContainerRef, Inject } from '@angular/core';
2
- import { ToolbarItemType } from '../../interfaces/toolbar';
3
- import { TheToolbarGroupToken, ToolbarMoreGroup } from '../../constants/toolbar';
4
- import { ElementKinds, ToolbarActionTypes } from '../../constants/node-types';
5
- import { TheToolbarItemComponent } from '../toolbar-item/toolbar-item.component';
6
- import { NavSplitLineComponent } from '../nav-split-line/nav-split-line.component';
7
- import { TheToolbarDropdownComponent } from '../toolbar-dropdown/toolbar-dropdown.component';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "ngx-tethys/nav";
10
- import * as i2 from "@angular/common";
11
- export class TheToolbarComponent {
12
- constructor(cdr, elementRef, ngZone, toolbarGroupComponent) {
13
- this.cdr = cdr;
14
- this.elementRef = elementRef;
15
- this.ngZone = ngZone;
16
- this.toolbarGroupComponent = toolbarGroupComponent;
17
- this.toolbarItems = [];
18
- this.containerClass = [];
19
- this.isMore = true;
20
- this.components = new Map();
21
- this.moreGroupMenu = ToolbarMoreGroup;
22
- this.elementWidth = 0;
23
- }
24
- ngOnInit() {
25
- this.setToolbarClass();
26
- this.renderToolbarView();
27
- this.selectionChange(this.editor);
28
- if (this.isMore) {
29
- this.resizeElement();
30
- }
31
- }
32
- ngOnChanges(changes) {
33
- const toolbarItems = changes.toolbarItems;
34
- if (toolbarItems && !toolbarItems.firstChange) {
35
- this.renderToolbarView();
36
- }
37
- }
38
- ngOnDestroy() {
39
- if (this.resizeObserver) {
40
- this.resizeObserver.disconnect();
41
- }
42
- }
43
- setToolbarClass() {
44
- if (this.editor && !!this.containerClass.length) {
45
- this.elementRef.nativeElement.classList.add(...this.containerClass);
46
- }
47
- }
48
- resizeElement() {
49
- const editableElement = this.elementRef.nativeElement;
50
- // @ts-ignore
51
- this.resizeObserver = new ResizeObserver(entries => {
52
- for (let entry of entries) {
53
- const { width } = entry.contentRect;
54
- if (this.isMore && this.elementWidth !== width) {
55
- this.elementWidth = width;
56
- this.renderToolbarView();
57
- }
58
- }
59
- });
60
- this.resizeObserver.observe(editableElement);
61
- }
62
- selectionChange(editor) {
63
- const toolbarItems = [...this.toolbarItems, this.moreGroupMenu];
64
- for (const item of toolbarItems) {
65
- if (item.key !== ToolbarActionTypes.split) {
66
- const itemComponent = this.components.get(item.key);
67
- if (itemComponent && itemComponent.instance.selectionChange) {
68
- itemComponent.instance.selectionChange(editor);
69
- }
70
- }
71
- }
72
- }
73
- renderToolbarView() {
74
- this.components.clear();
75
- this.toolbarContainer.clear();
76
- const toolbarItems = this.toolbarItemsCompose();
77
- const { items, group } = toolbarItems;
78
- this.ngZone.run(() => {
79
- for (const item of items) {
80
- if (item.key === ToolbarActionTypes.split) {
81
- this.createToolbarSplit();
82
- continue;
83
- }
84
- this.createToolbarItem(item);
85
- }
86
- this.createMoreGroup(group);
87
- });
88
- this.cdr.markForCheck();
89
- }
90
- /**
91
- * calculation display toolbar and more grouped toolbars
92
- *
93
- * ┌──────────────────────────────────────── GoolbarToolbarView ───────────────────────────────────┐
94
- * | ┌─────────────────────────────────────── #children ─────────────────────────────────────────┐ |
95
- * | | ┌─────── #itemsView ────────┐ ┌──────────────────────┐ ┌── #groupedItemsDropdown ───┐ | |
96
- * | | | #ungroupedItems | | ToolbarSeparatorView | | #groupedItems | | |
97
- * | | └──────────────────────────-┘ └──────────────────────┘ └────────────────────────────┘ | |
98
- * | | \---------- only when toolbar items overflow --------/ | |
99
- * | └───────────────────────────────────────────────────────────────────────────────────────────┘ |
100
- * └───────────────────────────────────────────────────────────────────────────────────────────────┘
101
- * split width: 6px
102
- * item width: default item: 35px; dropdown item: 50px
103
- * set aside 50px
104
- */
105
- toolbarItemsCompose() {
106
- let elementWidth = this.isMore ? this.elementWidth : null;
107
- const maxItemWidth = 50;
108
- const defaultItemWidth = 35;
109
- const splitWidth = 6;
110
- // special type
111
- const headingWidth = 70;
112
- const items = [];
113
- const group = [];
114
- for (const item of this.toolbarItems) {
115
- if (!this.isMore) {
116
- items.push(item);
117
- continue;
118
- }
119
- // not enough free space
120
- const allowRender = elementWidth && elementWidth > maxItemWidth;
121
- if (allowRender && item.key === ToolbarActionTypes.split) {
122
- items.push(item);
123
- elementWidth -= splitWidth;
124
- continue;
125
- }
126
- if (allowRender) {
127
- items.push(item);
128
- }
129
- else {
130
- group.push(item);
131
- }
132
- if (item.key === ElementKinds.headingList) {
133
- elementWidth -= headingWidth;
134
- continue;
135
- }
136
- const isCustomComponent = item?.type === ToolbarItemType.dropdown || !!item?.iconComponent;
137
- elementWidth -= isCustomComponent ? maxItemWidth : defaultItemWidth;
138
- }
139
- return {
140
- items: this.pureToolbarItems(items),
141
- group
142
- };
143
- }
144
- /**
145
- * externally designated more group
146
- */
147
- toolbarItemsAndMoreCompose() {
148
- const items = [];
149
- const group = [];
150
- for (const item of this.toolbarItems) {
151
- if (item.key === ToolbarActionTypes.split) {
152
- items.push(item);
153
- continue;
154
- }
155
- items.push(item);
156
- }
157
- return {
158
- items: this.pureToolbarItems(items),
159
- group
160
- };
161
- }
162
- /**
163
- * filter adjacent repeated dividers
164
- * @param {ToolbarItem[]} items
165
- * @returns
166
- * @memberof TheToolbarComponent
167
- */
168
- pureToolbarItems(items) {
169
- if (!Array.isArray(items)) {
170
- return [];
171
- }
172
- return items.filter((a, i) => {
173
- if (i > 0 && items[i - 1].key !== ToolbarActionTypes.split) {
174
- return true;
175
- }
176
- return a.key !== ToolbarActionTypes.split;
177
- });
178
- }
179
- createToolbarItem(item) {
180
- const { iconComponent, type, dropdownMode, dropdownItemKey, includes, ...args } = item;
181
- const viewComponent = this.viewComponentType(type);
182
- const compRef = this.toolbarContainer.createComponent(iconComponent ? iconComponent : viewComponent);
183
- compRef.instance.editor = this.editor;
184
- compRef.instance.toolbarItem = item;
185
- this.components.set(item.key, compRef);
186
- if (item.type === ToolbarItemType.dropdown) {
187
- const dropdownRef = compRef;
188
- dropdownRef.instance.dropdownItemKey = item.dropdownItemKey;
189
- dropdownRef.instance.menus = includes;
190
- dropdownRef.instance.mode = dropdownMode;
191
- }
192
- }
193
- createToolbarSplit() {
194
- this.toolbarContainer.createComponent(NavSplitLineComponent);
195
- }
196
- createMoreGroup(group) {
197
- if (group.length > 0) {
198
- const compRef = this.toolbarContainer.createComponent(this.toolbarGroupComponent);
199
- compRef.instance.editor = this.editor;
200
- compRef.instance.menus = group;
201
- compRef.instance.item = this.moreGroupMenu;
202
- this.components.set(this.moreGroupMenu.key, compRef);
203
- }
204
- }
205
- viewComponentType(type) {
206
- if (type === ToolbarItemType.default) {
207
- return TheToolbarItemComponent;
208
- }
209
- if (type === ToolbarItemType.dropdown) {
210
- return TheToolbarDropdownComponent;
211
- }
212
- return TheToolbarItemComponent;
213
- }
214
- }
215
- TheToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheToolbarComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: TheToolbarGroupToken }], target: i0.ɵɵFactoryTarget.Component });
216
- TheToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: TheToolbarComponent, selector: "the-toolbar", inputs: { editor: "editor", toolbarItems: "toolbarItems", align: "align", containerClass: "containerClass", isMore: "isMore", afterTemplate: "afterTemplate" }, host: { classAttribute: "the-toolbar-container" }, viewQueries: [{ propertyName: "toolbarContainer", first: true, predicate: ["toolbarContainer"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<thy-icon-nav [style.justifyContent]=\"align\">\r\n <ng-container #toolbarContainer></ng-container>\r\n <ng-content></ng-content>\r\n <ng-template *ngIf=\"afterTemplate\" [ngTemplateOutlet]=\"afterTemplate\"></ng-template>\r\n</thy-icon-nav>\r\n", components: [{ type: i1.ThyIconNavComponent, selector: "thy-icon-nav", inputs: ["thyType"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
217
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheToolbarComponent, decorators: [{
218
- type: Component,
219
- args: [{ selector: 'the-toolbar', host: {
220
- class: 'the-toolbar-container'
221
- }, template: "<thy-icon-nav [style.justifyContent]=\"align\">\r\n <ng-container #toolbarContainer></ng-container>\r\n <ng-content></ng-content>\r\n <ng-template *ngIf=\"afterTemplate\" [ngTemplateOutlet]=\"afterTemplate\"></ng-template>\r\n</thy-icon-nav>\r\n" }]
222
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
223
- type: Inject,
224
- args: [TheToolbarGroupToken]
225
- }] }]; }, propDecorators: { editor: [{
226
- type: Input
227
- }], toolbarItems: [{
228
- type: Input
229
- }], align: [{
230
- type: Input
231
- }], containerClass: [{
232
- type: Input
233
- }], isMore: [{
234
- type: Input
235
- }], afterTemplate: [{
236
- type: Input
237
- }], toolbarContainer: [{
238
- type: ViewChild,
239
- args: ['toolbarContainer', { read: ViewContainerRef, static: true }]
240
- }] } });
241
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvY29tcG9uZW50cy90b29sYmFyL3Rvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvdG9vbGJhci90b29sYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsS0FBSyxFQUVMLFNBQVMsRUFDVCxnQkFBZ0IsRUFPaEIsTUFBTSxFQUdULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBNEQsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7O0FBVzdGLE1BQU0sT0FBTyxtQkFBbUI7SUFvQjVCLFlBQ1ksR0FBc0IsRUFDdEIsVUFBc0IsRUFDdEIsTUFBYyxFQUNnQixxQkFBOEQ7UUFINUYsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2dCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBeUM7UUFyQi9GLGlCQUFZLEdBQWtCLEVBQUUsQ0FBQztRQUlqQyxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUU5QixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBTXZCLGVBQVUsR0FBbUMs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QixtR0F3QmhCLG9CQUFvQjtvR0F4QnZCLG1CQUFtQix1V0FhVyxnQkFBZ0IsZ0VDL0MzRCxnUUFLQTsyRkQ2QmEsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNJLGFBQWEsUUFFakI7d0JBQ0YsS0FBSyxFQUFFLHVCQUF1QjtxQkFDakM7OzBCQTBCSSxNQUFNOzJCQUFDLG9CQUFvQjs0Q0F2QnZCLE1BQU07c0JBQWQsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVtRSxnQkFBZ0I7c0JBQXhGLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBPbkNoYW5nZXMsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBDb21wb25lbnRSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgTmdab25lLFxuICAgIEluamVjdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IFRvb2xiYXJBbGlnbm1lbnQsIFRvb2xiYXJJdGVtLCBUb29sYmFySXRlbXNDb21wb3NlUmV0dXJuLCBUb29sYmFySXRlbVR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rvb2xiYXInO1xuaW1wb3J0IHsgVGhlVG9vbGJhckdyb3VwVG9rZW4sIFRvb2xiYXJNb3JlR3JvdXAgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdG9vbGJhcic7XG5pbXBvcnQgeyBFbGVtZW50S2luZHMsIFRvb2xiYXJBY3Rpb25UeXBlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub2RlLXR5cGVzJztcbmltcG9ydCB7IFRoZVRvb2xiYXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vdG9vbGJhci1pdGVtL3Rvb2xiYXItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmF2U3BsaXRMaW5lQ29tcG9uZW50IH0gZnJvbSAnLi4vbmF2LXNwbGl0LWxpbmUvbmF2LXNwbGl0LWxpbmUuY29tcG9uZW50JztcbmltcG9ydCB7IFRoZVRvb2xiYXJEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2xiYXItZHJvcGRvd24vdG9vbGJhci1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBUaGVUb29sYmFyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi90b29sYmFyLWdyb3VwL3Rvb2xiYXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFRoZUJhc2VUb29sYmFySXRlbSwgVGhlQmFzZVRvb2xiYXJEcm9wZG93biB9IGZyb20gJy4uLy4uL2NvcmUvdG9vbGJhci1pdGVtL2Jhc2UtdG9vbGJhci1pdGVtJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aGUtdG9vbGJhcicsXG4gICAgdGVtcGxhdGVVcmw6ICd0b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAndGhlLXRvb2xiYXItY29udGFpbmVyJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIGVkaXRvcjogRWRpdG9yO1xuXG4gICAgQElucHV0KCkgdG9vbGJhckl0ZW1zOiBUb29sYmFySXRlbVtdID0gW107XG5cbiAgICBASW5wdXQoKSBhbGlnbjogVG9vbGJhckFsaWdubWVudDtcblxuICAgIEBJbnB1dCgpIGNvbnRhaW5lckNsYXNzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgQElucHV0KCkgaXNNb3JlID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpIGFmdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCd0b29sYmFyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgdG9vbGJhckNvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICAgIGNvbXBvbmVudHM6IE1hcDxzdHJpbmcsIENvbXBvbmVudFJlZjxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgICBtb3JlR3JvdXBNZW51ID0gVG9vbGJhck1vcmVHcm91cDtcbiAgICByZXNpemVPYnNlcnZlcjtcbiAgICBlbGVtZW50V2lkdGggPSAwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBASW5qZWN0KFRoZVRvb2xiYXJHcm91cFRva2VuKSBwcml2YXRlIHRvb2xiYXJHcm91cENvbXBvbmVudDogQ29tcG9uZW50VHlwZTxUaGVUb29sYmFyR3JvdXBDb21wb25lbnQ+XG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0VG9vbGJhckNsYXNzKCk7XG4gICAgICAgIHRoaXMucmVuZGVyVG9vbGJhclZpZXcoKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UodGhpcy5lZGl0b3IpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTW9yZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGNoYW5nZXMudG9vbGJhckl0ZW1zO1xuICAgICAgICBpZiAodG9vbGJhckl0ZW1zICYmICF0b29sYmFySXRlbXMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVG9vbGJhclZpZXcoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VG9vbGJhckNsYXNzKCkge1xuICAgICAgICBpZiAodGhpcy5lZGl0b3IgJiYgISF0aGlzLmNvbnRhaW5lckNsYXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi50aGlzLmNvbnRhaW5lckNsYXNzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplRWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSBlbnRyeS5jb250ZW50UmVjdDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vcmUgJiYgdGhpcy5lbGVtZW50V2lkdGggIT09IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVG9vbGJhclZpZXcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWRpdGFibGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlKGVkaXRvcjogRWRpdG9yKSB7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IFsuLi50aGlzLnRvb2xiYXJJdGVtcywgdGhpcy5tb3JlR3JvdXBNZW51XTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRvb2xiYXJJdGVtcykge1xuICAgICAgICAgICAgaWYgKGl0ZW0ua2V5ICE9PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmdldChpdGVtLmtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1Db21wb25lbnQgJiYgaXRlbUNvbXBvbmVudC5pbnN0YW5jZS5zZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvbXBvbmVudC5pbnN0YW5jZS5zZWxlY3Rpb25DaGFuZ2UoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyVG9vbGJhclZpZXcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5jbGVhcigpO1xuICAgICAgICB0aGlzLnRvb2xiYXJDb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgY29uc3QgdG9vbGJhckl0ZW1zID0gdGhpcy50b29sYmFySXRlbXNDb21wb3NlKCk7XG4gICAgICAgIGNvbnN0IHsgaXRlbXMsIGdyb3VwIH0gPSB0b29sYmFySXRlbXM7XG5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmtleSA9PT0gVG9vbGJhckFjdGlvblR5cGVzLnNwbGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVG9vbGJhclNwbGl0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVNb3JlR3JvdXAoZ3JvdXApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY2FsY3VsYXRpb24gZGlzcGxheSB0b29sYmFyIGFuZCBtb3JlIGdyb3VwZWQgdG9vbGJhcnNcbiAgICAgKlxuICAgICAqXHTilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgR29vbGJhclRvb2xiYXJWaWV3IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgICAqXHR8IOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAjY2hpbGRyZW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIHxcbiAgICAgKlx0fCB8ICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSAICNpdGVtc1ZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIzilIDilIAgI2dyb3VwZWRJdGVtc0Ryb3Bkb3duIOKUgOKUgOKUgOKUkCAgIHwgfFxuICAgICAqXHR8IHwgICB8ICAgICAgICN1bmdyb3VwZWRJdGVtcyAgICAgfCB8IFRvb2xiYXJTZXBhcmF0b3JWaWV3IHwgfCAgICAgICAgI2dyb3VwZWRJdGVtcyAgICAgICB8ICAgfCB8XG4gICAgICpcdHwgfCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgC3ilJgg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIHwgfFxuICAgICAqXHR8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwtLS0tLS0tLS0tIG9ubHkgd2hlbiB0b29sYmFyIGl0ZW1zIG92ZXJmbG93IC0tLS0tLS0tLyAgIHwgfFxuICAgICAqXHR8IOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCB8XG4gICAgICpcdOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgICAqIHNwbGl0IHdpZHRoOiA2cHhcbiAgICAgKiBpdGVtIHdpZHRoOiBkZWZhdWx0IGl0ZW06IDM1cHg7IGRyb3Bkb3duIGl0ZW06IDUwcHhcbiAgICAgKiBzZXQgYXNpZGUgNTBweFxuICAgICAqL1xuICAgIHByaXZhdGUgdG9vbGJhckl0ZW1zQ29tcG9zZSgpOiBUb29sYmFySXRlbXNDb21wb3NlUmV0dXJuIHtcbiAgICAgICAgbGV0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaXNNb3JlID8gdGhpcy5lbGVtZW50V2lkdGggOiBudWxsO1xuICAgICAgICBjb25zdCBtYXhJdGVtV2lkdGggPSA1MDtcbiAgICAgICAgY29uc3QgZGVmYXVsdEl0ZW1XaWR0aCA9IDM1O1xuICAgICAgICBjb25zdCBzcGxpdFdpZHRoID0gNjtcbiAgICAgICAgLy8gc3BlY2lhbCB0eXBlXG4gICAgICAgIGNvbnN0IGhlYWRpbmdXaWR0aCA9IDcwO1xuICAgICAgICBjb25zdCBpdGVtczogVG9vbGJhckl0ZW1bXSA9IFtdO1xuICAgICAgICBjb25zdCBncm91cDogVG9vbGJhckl0ZW1bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnRvb2xiYXJJdGVtcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTW9yZSkge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vdCBlbm91Z2ggZnJlZSBzcGFjZVxuICAgICAgICAgICAgY29uc3QgYWxsb3dSZW5kZXIgPSBlbGVtZW50V2lkdGggJiYgZWxlbWVudFdpZHRoID4gbWF4SXRlbVdpZHRoO1xuICAgICAgICAgICAgaWYgKGFsbG93UmVuZGVyICYmIGl0ZW0ua2V5ID09PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRXaWR0aCAtPSBzcGxpdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWxsb3dSZW5kZXIpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBncm91cC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgPT09IEVsZW1lbnRLaW5kcy5oZWFkaW5nTGlzdCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRXaWR0aCAtPSBoZWFkaW5nV2lkdGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0N1c3RvbUNvbXBvbmVudCA9IGl0ZW0/LnR5cGUgPT09IFRvb2xiYXJJdGVtVHlwZS5kcm9wZG93biB8fCAhIWl0ZW0/Lmljb25Db21wb25lbnQ7XG4gICAgICAgICAgICBlbGVtZW50V2lkdGggLT0gaXNDdXN0b21Db21wb25lbnQgPyBtYXhJdGVtV2lkdGggOiBkZWZhdWx0SXRlbVdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnB1cmVUb29sYmFySXRlbXMoaXRlbXMpLFxuICAgICAgICAgICAgZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHRlcm5hbGx5IGRlc2lnbmF0ZWQgbW9yZSBncm91cFxuICAgICAqL1xuICAgIHByaXZhdGUgdG9vbGJhckl0ZW1zQW5kTW9yZUNvbXBvc2UoKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIGNvbnN0IGdyb3VwID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMudG9vbGJhckl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgPT09IFRvb2xiYXJBY3Rpb25UeXBlcy5zcGxpdCkge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnB1cmVUb29sYmFySXRlbXMoaXRlbXMpLFxuICAgICAgICAgICAgZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBmaWx0ZXIgYWRqYWNlbnQgcmVwZWF0ZWQgZGl2aWRlcnNcbiAgICAgKiBAcGFyYW0ge1Rvb2xiYXJJdGVtW119IGl0ZW1zXG4gICAgICogQHJldHVybnNcbiAgICAgKiBAbWVtYmVyb2YgVGhlVG9vbGJhckNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1cmVUb29sYmFySXRlbXMoaXRlbXM6IFRvb2xiYXJJdGVtW10pIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGEsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBpdGVtc1tpIC0gMV0ua2V5ICE9PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhLmtleSAhPT0gVG9vbGJhckFjdGlvblR5cGVzLnNwbGl0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRvb2xiYXJJdGVtKGl0ZW06IFRvb2xiYXJJdGVtKSB7XG4gICAgICAgIGNvbnN0IHsgaWNvbkNvbXBvbmVudCwgdHlwZSwgZHJvcGRvd25Nb2RlLCBkcm9wZG93bkl0ZW1LZXksIGluY2x1ZGVzLCAuLi5hcmdzIH0gPSBpdGVtO1xuICAgICAgICBjb25zdCB2aWV3Q29tcG9uZW50ID0gdGhpcy52aWV3Q29tcG9uZW50VHlwZSh0eXBlKTtcbiAgICAgICAgY29uc3QgY29tcFJlZiA9IHRoaXMudG9vbGJhckNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQ8VGhlQmFzZVRvb2xiYXJJdGVtPihpY29uQ29tcG9uZW50ID8gaWNvbkNvbXBvbmVudCA6IHZpZXdDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbXBSZWYuaW5zdGFuY2UuZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgICAgIGNvbXBSZWYuaW5zdGFuY2UudG9vbGJhckl0ZW0gPSBpdGVtO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMuc2V0KGl0ZW0ua2V5LCBjb21wUmVmKTtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gVG9vbGJhckl0ZW1UeXBlLmRyb3Bkb3duKSB7XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93blJlZiA9IGNvbXBSZWYgYXMgdW5rbm93biBhcyBDb21wb25lbnRSZWY8VGhlQmFzZVRvb2xiYXJEcm9wZG93bj47XG4gICAgICAgICAgICBkcm9wZG93blJlZi5pbnN0YW5jZS5kcm9wZG93bkl0ZW1LZXkgPSBpdGVtLmRyb3Bkb3duSXRlbUtleTtcbiAgICAgICAgICAgIGRyb3Bkb3duUmVmLmluc3RhbmNlLm1lbnVzID0gaW5jbHVkZXMgYXMgVG9vbGJhckl0ZW1bXTtcbiAgICAgICAgICAgIGRyb3Bkb3duUmVmLmluc3RhbmNlLm1vZGUgPSBkcm9wZG93bk1vZGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRvb2xiYXJTcGxpdCgpIHtcbiAgICAgICAgdGhpcy50b29sYmFyQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChOYXZTcGxpdExpbmVDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTW9yZUdyb3VwKGdyb3VwOiBUb29sYmFySXRlbVtdKSB7XG4gICAgICAgIGlmIChncm91cC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wUmVmID0gdGhpcy50b29sYmFyQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudCh0aGlzLnRvb2xiYXJHcm91cENvbXBvbmVudCk7XG4gICAgICAgICAgICBjb21wUmVmLmluc3RhbmNlLmVkaXRvciA9IHRoaXMuZWRpdG9yO1xuICAgICAgICAgICAgY29tcFJlZi5pbnN0YW5jZS5tZW51cyA9IGdyb3VwO1xuICAgICAgICAgICAgY29tcFJlZi5pbnN0YW5jZS5pdGVtID0gdGhpcy5tb3JlR3JvdXBNZW51O1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnNldCh0aGlzLm1vcmVHcm91cE1lbnUua2V5LCBjb21wUmVmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmlld0NvbXBvbmVudFR5cGUodHlwZTogVG9vbGJhckl0ZW1UeXBlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSBUb29sYmFySXRlbVR5cGUuZGVmYXVsdCkge1xuICAgICAgICAgICAgcmV0dXJuIFRoZVRvb2xiYXJJdGVtQ29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBUb29sYmFySXRlbVR5cGUuZHJvcGRvd24pIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUb29sYmFyRHJvcGRvd25Db21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRoZVRvb2xiYXJJdGVtQ29tcG9uZW50O1xuICAgIH1cbn1cbiIsIjx0aHktaWNvbi1uYXYgW3N0eWxlLmp1c3RpZnlDb250ZW50XT1cImFsaWduXCI+XHJcbiAgICA8bmctY29udGFpbmVyICN0b29sYmFyQ29udGFpbmVyPjwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiYWZ0ZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFmdGVyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG48L3RoeS1pY29uLW5hdj5cclxuIl19
1
+ import { Component, Input, ViewChild, ViewContainerRef, Inject } from '@angular/core';
2
+ import { ToolbarItemType } from '../../interfaces/toolbar';
3
+ import { TheToolbarGroupToken, ToolbarMoreGroup } from '../../constants/toolbar';
4
+ import { ElementKinds, ToolbarActionTypes } from '../../constants/node-types';
5
+ import { TheToolbarItemComponent } from '../toolbar-item/toolbar-item.component';
6
+ import { NavSplitLineComponent } from '../nav-split-line/nav-split-line.component';
7
+ import { TheToolbarDropdownComponent } from '../toolbar-dropdown/toolbar-dropdown.component';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "ngx-tethys/nav";
10
+ import * as i2 from "@angular/common";
11
+ export class TheToolbarComponent {
12
+ constructor(cdr, elementRef, ngZone, toolbarGroupComponent) {
13
+ this.cdr = cdr;
14
+ this.elementRef = elementRef;
15
+ this.ngZone = ngZone;
16
+ this.toolbarGroupComponent = toolbarGroupComponent;
17
+ this.toolbarItems = [];
18
+ this.containerClass = [];
19
+ this.isMore = true;
20
+ this.components = new Map();
21
+ this.moreGroupMenu = ToolbarMoreGroup;
22
+ this.elementWidth = 0;
23
+ }
24
+ ngOnInit() {
25
+ this.setToolbarClass();
26
+ this.renderToolbarView();
27
+ this.selectionChange(this.editor);
28
+ if (this.isMore) {
29
+ this.resizeElement();
30
+ }
31
+ }
32
+ ngOnChanges(changes) {
33
+ const toolbarItems = changes.toolbarItems;
34
+ if (toolbarItems && !toolbarItems.firstChange) {
35
+ this.renderToolbarView();
36
+ }
37
+ }
38
+ ngOnDestroy() {
39
+ if (this.resizeObserver) {
40
+ this.resizeObserver.disconnect();
41
+ }
42
+ }
43
+ setToolbarClass() {
44
+ if (this.editor && !!this.containerClass.length) {
45
+ this.elementRef.nativeElement.classList.add(...this.containerClass);
46
+ }
47
+ }
48
+ resizeElement() {
49
+ const editableElement = this.elementRef.nativeElement;
50
+ // @ts-ignore
51
+ this.resizeObserver = new ResizeObserver(entries => {
52
+ for (let entry of entries) {
53
+ const { width } = entry.contentRect;
54
+ if (this.isMore && this.elementWidth !== width) {
55
+ this.elementWidth = width;
56
+ this.renderToolbarView();
57
+ }
58
+ }
59
+ });
60
+ this.resizeObserver.observe(editableElement);
61
+ }
62
+ selectionChange(editor) {
63
+ const toolbarItems = [...this.toolbarItems, this.moreGroupMenu];
64
+ for (const item of toolbarItems) {
65
+ if (item.key !== ToolbarActionTypes.split) {
66
+ const itemComponent = this.components.get(item.key);
67
+ if (itemComponent && itemComponent.instance.selectionChange) {
68
+ itemComponent.instance.selectionChange(editor);
69
+ }
70
+ }
71
+ }
72
+ }
73
+ renderToolbarView() {
74
+ this.components.clear();
75
+ this.toolbarContainer.clear();
76
+ const toolbarItems = this.toolbarItemsCompose();
77
+ const { items, group } = toolbarItems;
78
+ this.ngZone.run(() => {
79
+ for (const item of items) {
80
+ if (item.key === ToolbarActionTypes.split) {
81
+ this.createToolbarSplit();
82
+ continue;
83
+ }
84
+ this.createToolbarItem(item);
85
+ }
86
+ this.createMoreGroup(group);
87
+ });
88
+ this.cdr.markForCheck();
89
+ }
90
+ /**
91
+ * calculation display toolbar and more grouped toolbars
92
+ *
93
+ * ┌──────────────────────────────────────── GoolbarToolbarView ───────────────────────────────────┐
94
+ * | ┌─────────────────────────────────────── #children ─────────────────────────────────────────┐ |
95
+ * | | ┌─────── #itemsView ────────┐ ┌──────────────────────┐ ┌── #groupedItemsDropdown ───┐ | |
96
+ * | | | #ungroupedItems | | ToolbarSeparatorView | | #groupedItems | | |
97
+ * | | └──────────────────────────-┘ └──────────────────────┘ └────────────────────────────┘ | |
98
+ * | | \---------- only when toolbar items overflow --------/ | |
99
+ * | └───────────────────────────────────────────────────────────────────────────────────────────┘ |
100
+ * └───────────────────────────────────────────────────────────────────────────────────────────────┘
101
+ * split width: 6px
102
+ * item width: default item: 35px; dropdown item: 50px
103
+ * set aside 50px
104
+ */
105
+ toolbarItemsCompose() {
106
+ let elementWidth = this.isMore ? this.elementWidth : null;
107
+ const maxItemWidth = 50;
108
+ const defaultItemWidth = 35;
109
+ const splitWidth = 6;
110
+ // special type
111
+ const headingWidth = 70;
112
+ const items = [];
113
+ const group = [];
114
+ for (const item of this.toolbarItems) {
115
+ if (!this.isMore) {
116
+ items.push(item);
117
+ continue;
118
+ }
119
+ // not enough free space
120
+ const allowRender = elementWidth && elementWidth > maxItemWidth;
121
+ if (allowRender && item.key === ToolbarActionTypes.split) {
122
+ items.push(item);
123
+ elementWidth -= splitWidth;
124
+ continue;
125
+ }
126
+ if (allowRender) {
127
+ items.push(item);
128
+ }
129
+ else {
130
+ group.push(item);
131
+ }
132
+ if (item.key === ElementKinds.headingList) {
133
+ elementWidth -= headingWidth;
134
+ continue;
135
+ }
136
+ const isCustomComponent = item?.type === ToolbarItemType.dropdown || !!item?.iconComponent;
137
+ elementWidth -= isCustomComponent ? maxItemWidth : defaultItemWidth;
138
+ }
139
+ return {
140
+ items: this.pureToolbarItems(items),
141
+ group
142
+ };
143
+ }
144
+ /**
145
+ * externally designated more group
146
+ */
147
+ toolbarItemsAndMoreCompose() {
148
+ const items = [];
149
+ const group = [];
150
+ for (const item of this.toolbarItems) {
151
+ if (item.key === ToolbarActionTypes.split) {
152
+ items.push(item);
153
+ continue;
154
+ }
155
+ items.push(item);
156
+ }
157
+ return {
158
+ items: this.pureToolbarItems(items),
159
+ group
160
+ };
161
+ }
162
+ /**
163
+ * filter adjacent repeated dividers
164
+ * @param {ToolbarItem[]} items
165
+ * @returns
166
+ * @memberof TheToolbarComponent
167
+ */
168
+ pureToolbarItems(items) {
169
+ if (!Array.isArray(items)) {
170
+ return [];
171
+ }
172
+ return items.filter((a, i) => {
173
+ if (i > 0 && items[i - 1].key !== ToolbarActionTypes.split) {
174
+ return true;
175
+ }
176
+ return a.key !== ToolbarActionTypes.split;
177
+ });
178
+ }
179
+ createToolbarItem(item) {
180
+ const { iconComponent, type, dropdownMode, dropdownItemKey, includes, ...args } = item;
181
+ const viewComponent = this.viewComponentType(type);
182
+ const compRef = this.toolbarContainer.createComponent(iconComponent ? iconComponent : viewComponent);
183
+ compRef.instance.editor = this.editor;
184
+ compRef.instance.toolbarItem = item;
185
+ this.components.set(item.key, compRef);
186
+ if (item.type === ToolbarItemType.dropdown) {
187
+ const dropdownRef = compRef;
188
+ dropdownRef.instance.dropdownItemKey = item.dropdownItemKey;
189
+ dropdownRef.instance.menus = includes;
190
+ dropdownRef.instance.mode = dropdownMode;
191
+ }
192
+ }
193
+ createToolbarSplit() {
194
+ this.toolbarContainer.createComponent(NavSplitLineComponent);
195
+ }
196
+ createMoreGroup(group) {
197
+ if (group.length > 0) {
198
+ const compRef = this.toolbarContainer.createComponent(this.toolbarGroupComponent);
199
+ compRef.instance.editor = this.editor;
200
+ compRef.instance.menus = group;
201
+ compRef.instance.item = this.moreGroupMenu;
202
+ this.components.set(this.moreGroupMenu.key, compRef);
203
+ }
204
+ }
205
+ viewComponentType(type) {
206
+ if (type === ToolbarItemType.default) {
207
+ return TheToolbarItemComponent;
208
+ }
209
+ if (type === ToolbarItemType.dropdown) {
210
+ return TheToolbarDropdownComponent;
211
+ }
212
+ return TheToolbarItemComponent;
213
+ }
214
+ }
215
+ TheToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheToolbarComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: TheToolbarGroupToken }], target: i0.ɵɵFactoryTarget.Component });
216
+ TheToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: TheToolbarComponent, selector: "the-toolbar", inputs: { editor: "editor", toolbarItems: "toolbarItems", align: "align", containerClass: "containerClass", isMore: "isMore", afterTemplate: "afterTemplate" }, host: { classAttribute: "the-toolbar-container" }, viewQueries: [{ propertyName: "toolbarContainer", first: true, predicate: ["toolbarContainer"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<thy-icon-nav [style.justifyContent]=\"align\">\n <ng-container #toolbarContainer></ng-container>\n <ng-content></ng-content>\n <ng-template *ngIf=\"afterTemplate\" [ngTemplateOutlet]=\"afterTemplate\"></ng-template>\n</thy-icon-nav>\n", components: [{ type: i1.ThyIconNavComponent, selector: "thy-icon-nav", inputs: ["thyType"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
217
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheToolbarComponent, decorators: [{
218
+ type: Component,
219
+ args: [{ selector: 'the-toolbar', host: {
220
+ class: 'the-toolbar-container'
221
+ }, template: "<thy-icon-nav [style.justifyContent]=\"align\">\n <ng-container #toolbarContainer></ng-container>\n <ng-content></ng-content>\n <ng-template *ngIf=\"afterTemplate\" [ngTemplateOutlet]=\"afterTemplate\"></ng-template>\n</thy-icon-nav>\n" }]
222
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
223
+ type: Inject,
224
+ args: [TheToolbarGroupToken]
225
+ }] }]; }, propDecorators: { editor: [{
226
+ type: Input
227
+ }], toolbarItems: [{
228
+ type: Input
229
+ }], align: [{
230
+ type: Input
231
+ }], containerClass: [{
232
+ type: Input
233
+ }], isMore: [{
234
+ type: Input
235
+ }], afterTemplate: [{
236
+ type: Input
237
+ }], toolbarContainer: [{
238
+ type: ViewChild,
239
+ args: ['toolbarContainer', { read: ViewContainerRef, static: true }]
240
+ }] } });
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvY29tcG9uZW50cy90b29sYmFyL3Rvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvdG9vbGJhci90b29sYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsS0FBSyxFQUVMLFNBQVMsRUFDVCxnQkFBZ0IsRUFPaEIsTUFBTSxFQUdULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBNEQsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7O0FBVzdGLE1BQU0sT0FBTyxtQkFBbUI7SUFvQjVCLFlBQ1ksR0FBc0IsRUFDdEIsVUFBc0IsRUFDdEIsTUFBYyxFQUNnQixxQkFBOEQ7UUFINUYsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2dCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBeUM7UUFyQi9GLGlCQUFZLEdBQWtCLEVBQUUsQ0FBQztRQUlqQyxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUU5QixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBTXZCLGVBQVUsR0FBbUMs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QixtR0F3QmhCLG9CQUFvQjtvR0F4QnZCLG1CQUFtQix1V0FhVyxnQkFBZ0IsZ0VDL0MzRCxzUEFLQTsyRkQ2QmEsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNJLGFBQWEsUUFFakI7d0JBQ0YsS0FBSyxFQUFFLHVCQUF1QjtxQkFDakM7OzBCQTBCSSxNQUFNOzJCQUFDLG9CQUFvQjs0Q0F2QnZCLE1BQU07c0JBQWQsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVtRSxnQkFBZ0I7c0JBQXhGLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBPbkNoYW5nZXMsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBDb21wb25lbnRSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgTmdab25lLFxuICAgIEluamVjdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IFRvb2xiYXJBbGlnbm1lbnQsIFRvb2xiYXJJdGVtLCBUb29sYmFySXRlbXNDb21wb3NlUmV0dXJuLCBUb29sYmFySXRlbVR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rvb2xiYXInO1xuaW1wb3J0IHsgVGhlVG9vbGJhckdyb3VwVG9rZW4sIFRvb2xiYXJNb3JlR3JvdXAgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdG9vbGJhcic7XG5pbXBvcnQgeyBFbGVtZW50S2luZHMsIFRvb2xiYXJBY3Rpb25UeXBlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub2RlLXR5cGVzJztcbmltcG9ydCB7IFRoZVRvb2xiYXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vdG9vbGJhci1pdGVtL3Rvb2xiYXItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmF2U3BsaXRMaW5lQ29tcG9uZW50IH0gZnJvbSAnLi4vbmF2LXNwbGl0LWxpbmUvbmF2LXNwbGl0LWxpbmUuY29tcG9uZW50JztcbmltcG9ydCB7IFRoZVRvb2xiYXJEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2xiYXItZHJvcGRvd24vdG9vbGJhci1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBUaGVUb29sYmFyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi90b29sYmFyLWdyb3VwL3Rvb2xiYXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFRoZUJhc2VUb29sYmFySXRlbSwgVGhlQmFzZVRvb2xiYXJEcm9wZG93biB9IGZyb20gJy4uLy4uL2NvcmUvdG9vbGJhci1pdGVtL2Jhc2UtdG9vbGJhci1pdGVtJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aGUtdG9vbGJhcicsXG4gICAgdGVtcGxhdGVVcmw6ICd0b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAndGhlLXRvb2xiYXItY29udGFpbmVyJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIGVkaXRvcjogRWRpdG9yO1xuXG4gICAgQElucHV0KCkgdG9vbGJhckl0ZW1zOiBUb29sYmFySXRlbVtdID0gW107XG5cbiAgICBASW5wdXQoKSBhbGlnbjogVG9vbGJhckFsaWdubWVudDtcblxuICAgIEBJbnB1dCgpIGNvbnRhaW5lckNsYXNzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgQElucHV0KCkgaXNNb3JlID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpIGFmdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCd0b29sYmFyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgdG9vbGJhckNvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICAgIGNvbXBvbmVudHM6IE1hcDxzdHJpbmcsIENvbXBvbmVudFJlZjxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgICBtb3JlR3JvdXBNZW51ID0gVG9vbGJhck1vcmVHcm91cDtcbiAgICByZXNpemVPYnNlcnZlcjtcbiAgICBlbGVtZW50V2lkdGggPSAwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBASW5qZWN0KFRoZVRvb2xiYXJHcm91cFRva2VuKSBwcml2YXRlIHRvb2xiYXJHcm91cENvbXBvbmVudDogQ29tcG9uZW50VHlwZTxUaGVUb29sYmFyR3JvdXBDb21wb25lbnQ+XG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0VG9vbGJhckNsYXNzKCk7XG4gICAgICAgIHRoaXMucmVuZGVyVG9vbGJhclZpZXcoKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UodGhpcy5lZGl0b3IpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTW9yZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGNoYW5nZXMudG9vbGJhckl0ZW1zO1xuICAgICAgICBpZiAodG9vbGJhckl0ZW1zICYmICF0b29sYmFySXRlbXMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVG9vbGJhclZpZXcoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VG9vbGJhckNsYXNzKCkge1xuICAgICAgICBpZiAodGhpcy5lZGl0b3IgJiYgISF0aGlzLmNvbnRhaW5lckNsYXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi50aGlzLmNvbnRhaW5lckNsYXNzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplRWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSBlbnRyeS5jb250ZW50UmVjdDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vcmUgJiYgdGhpcy5lbGVtZW50V2lkdGggIT09IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVG9vbGJhclZpZXcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWRpdGFibGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlKGVkaXRvcjogRWRpdG9yKSB7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IFsuLi50aGlzLnRvb2xiYXJJdGVtcywgdGhpcy5tb3JlR3JvdXBNZW51XTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRvb2xiYXJJdGVtcykge1xuICAgICAgICAgICAgaWYgKGl0ZW0ua2V5ICE9PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmdldChpdGVtLmtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1Db21wb25lbnQgJiYgaXRlbUNvbXBvbmVudC5pbnN0YW5jZS5zZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvbXBvbmVudC5pbnN0YW5jZS5zZWxlY3Rpb25DaGFuZ2UoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyVG9vbGJhclZpZXcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5jbGVhcigpO1xuICAgICAgICB0aGlzLnRvb2xiYXJDb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgY29uc3QgdG9vbGJhckl0ZW1zID0gdGhpcy50b29sYmFySXRlbXNDb21wb3NlKCk7XG4gICAgICAgIGNvbnN0IHsgaXRlbXMsIGdyb3VwIH0gPSB0b29sYmFySXRlbXM7XG5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmtleSA9PT0gVG9vbGJhckFjdGlvblR5cGVzLnNwbGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVG9vbGJhclNwbGl0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVNb3JlR3JvdXAoZ3JvdXApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY2FsY3VsYXRpb24gZGlzcGxheSB0b29sYmFyIGFuZCBtb3JlIGdyb3VwZWQgdG9vbGJhcnNcbiAgICAgKlxuICAgICAqXHTilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgR29vbGJhclRvb2xiYXJWaWV3IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgICAqXHR8IOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAjY2hpbGRyZW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIHxcbiAgICAgKlx0fCB8ICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSAICNpdGVtc1ZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilIzilIDilIAgI2dyb3VwZWRJdGVtc0Ryb3Bkb3duIOKUgOKUgOKUgOKUkCAgIHwgfFxuICAgICAqXHR8IHwgICB8ICAgICAgICN1bmdyb3VwZWRJdGVtcyAgICAgfCB8IFRvb2xiYXJTZXBhcmF0b3JWaWV3IHwgfCAgICAgICAgI2dyb3VwZWRJdGVtcyAgICAgICB8ICAgfCB8XG4gICAgICpcdHwgfCAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgC3ilJgg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIHwgfFxuICAgICAqXHR8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwtLS0tLS0tLS0tIG9ubHkgd2hlbiB0b29sYmFyIGl0ZW1zIG92ZXJmbG93IC0tLS0tLS0tLyAgIHwgfFxuICAgICAqXHR8IOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCB8XG4gICAgICpcdOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgICAqIHNwbGl0IHdpZHRoOiA2cHhcbiAgICAgKiBpdGVtIHdpZHRoOiBkZWZhdWx0IGl0ZW06IDM1cHg7IGRyb3Bkb3duIGl0ZW06IDUwcHhcbiAgICAgKiBzZXQgYXNpZGUgNTBweFxuICAgICAqL1xuICAgIHByaXZhdGUgdG9vbGJhckl0ZW1zQ29tcG9zZSgpOiBUb29sYmFySXRlbXNDb21wb3NlUmV0dXJuIHtcbiAgICAgICAgbGV0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaXNNb3JlID8gdGhpcy5lbGVtZW50V2lkdGggOiBudWxsO1xuICAgICAgICBjb25zdCBtYXhJdGVtV2lkdGggPSA1MDtcbiAgICAgICAgY29uc3QgZGVmYXVsdEl0ZW1XaWR0aCA9IDM1O1xuICAgICAgICBjb25zdCBzcGxpdFdpZHRoID0gNjtcbiAgICAgICAgLy8gc3BlY2lhbCB0eXBlXG4gICAgICAgIGNvbnN0IGhlYWRpbmdXaWR0aCA9IDcwO1xuICAgICAgICBjb25zdCBpdGVtczogVG9vbGJhckl0ZW1bXSA9IFtdO1xuICAgICAgICBjb25zdCBncm91cDogVG9vbGJhckl0ZW1bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnRvb2xiYXJJdGVtcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTW9yZSkge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vdCBlbm91Z2ggZnJlZSBzcGFjZVxuICAgICAgICAgICAgY29uc3QgYWxsb3dSZW5kZXIgPSBlbGVtZW50V2lkdGggJiYgZWxlbWVudFdpZHRoID4gbWF4SXRlbVdpZHRoO1xuICAgICAgICAgICAgaWYgKGFsbG93UmVuZGVyICYmIGl0ZW0ua2V5ID09PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRXaWR0aCAtPSBzcGxpdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWxsb3dSZW5kZXIpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBncm91cC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgPT09IEVsZW1lbnRLaW5kcy5oZWFkaW5nTGlzdCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRXaWR0aCAtPSBoZWFkaW5nV2lkdGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0N1c3RvbUNvbXBvbmVudCA9IGl0ZW0/LnR5cGUgPT09IFRvb2xiYXJJdGVtVHlwZS5kcm9wZG93biB8fCAhIWl0ZW0/Lmljb25Db21wb25lbnQ7XG4gICAgICAgICAgICBlbGVtZW50V2lkdGggLT0gaXNDdXN0b21Db21wb25lbnQgPyBtYXhJdGVtV2lkdGggOiBkZWZhdWx0SXRlbVdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnB1cmVUb29sYmFySXRlbXMoaXRlbXMpLFxuICAgICAgICAgICAgZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHRlcm5hbGx5IGRlc2lnbmF0ZWQgbW9yZSBncm91cFxuICAgICAqL1xuICAgIHByaXZhdGUgdG9vbGJhckl0ZW1zQW5kTW9yZUNvbXBvc2UoKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIGNvbnN0IGdyb3VwID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMudG9vbGJhckl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgPT09IFRvb2xiYXJBY3Rpb25UeXBlcy5zcGxpdCkge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnB1cmVUb29sYmFySXRlbXMoaXRlbXMpLFxuICAgICAgICAgICAgZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBmaWx0ZXIgYWRqYWNlbnQgcmVwZWF0ZWQgZGl2aWRlcnNcbiAgICAgKiBAcGFyYW0ge1Rvb2xiYXJJdGVtW119IGl0ZW1zXG4gICAgICogQHJldHVybnNcbiAgICAgKiBAbWVtYmVyb2YgVGhlVG9vbGJhckNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1cmVUb29sYmFySXRlbXMoaXRlbXM6IFRvb2xiYXJJdGVtW10pIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGEsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBpdGVtc1tpIC0gMV0ua2V5ICE9PSBUb29sYmFyQWN0aW9uVHlwZXMuc3BsaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhLmtleSAhPT0gVG9vbGJhckFjdGlvblR5cGVzLnNwbGl0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRvb2xiYXJJdGVtKGl0ZW06IFRvb2xiYXJJdGVtKSB7XG4gICAgICAgIGNvbnN0IHsgaWNvbkNvbXBvbmVudCwgdHlwZSwgZHJvcGRvd25Nb2RlLCBkcm9wZG93bkl0ZW1LZXksIGluY2x1ZGVzLCAuLi5hcmdzIH0gPSBpdGVtO1xuICAgICAgICBjb25zdCB2aWV3Q29tcG9uZW50ID0gdGhpcy52aWV3Q29tcG9uZW50VHlwZSh0eXBlKTtcbiAgICAgICAgY29uc3QgY29tcFJlZiA9IHRoaXMudG9vbGJhckNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQ8VGhlQmFzZVRvb2xiYXJJdGVtPihpY29uQ29tcG9uZW50ID8gaWNvbkNvbXBvbmVudCA6IHZpZXdDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbXBSZWYuaW5zdGFuY2UuZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgICAgIGNvbXBSZWYuaW5zdGFuY2UudG9vbGJhckl0ZW0gPSBpdGVtO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMuc2V0KGl0ZW0ua2V5LCBjb21wUmVmKTtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gVG9vbGJhckl0ZW1UeXBlLmRyb3Bkb3duKSB7XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93blJlZiA9IGNvbXBSZWYgYXMgdW5rbm93biBhcyBDb21wb25lbnRSZWY8VGhlQmFzZVRvb2xiYXJEcm9wZG93bj47XG4gICAgICAgICAgICBkcm9wZG93blJlZi5pbnN0YW5jZS5kcm9wZG93bkl0ZW1LZXkgPSBpdGVtLmRyb3Bkb3duSXRlbUtleTtcbiAgICAgICAgICAgIGRyb3Bkb3duUmVmLmluc3RhbmNlLm1lbnVzID0gaW5jbHVkZXMgYXMgVG9vbGJhckl0ZW1bXTtcbiAgICAgICAgICAgIGRyb3Bkb3duUmVmLmluc3RhbmNlLm1vZGUgPSBkcm9wZG93bk1vZGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRvb2xiYXJTcGxpdCgpIHtcbiAgICAgICAgdGhpcy50b29sYmFyQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChOYXZTcGxpdExpbmVDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTW9yZUdyb3VwKGdyb3VwOiBUb29sYmFySXRlbVtdKSB7XG4gICAgICAgIGlmIChncm91cC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wUmVmID0gdGhpcy50b29sYmFyQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudCh0aGlzLnRvb2xiYXJHcm91cENvbXBvbmVudCk7XG4gICAgICAgICAgICBjb21wUmVmLmluc3RhbmNlLmVkaXRvciA9IHRoaXMuZWRpdG9yO1xuICAgICAgICAgICAgY29tcFJlZi5pbnN0YW5jZS5tZW51cyA9IGdyb3VwO1xuICAgICAgICAgICAgY29tcFJlZi5pbnN0YW5jZS5pdGVtID0gdGhpcy5tb3JlR3JvdXBNZW51O1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnNldCh0aGlzLm1vcmVHcm91cE1lbnUua2V5LCBjb21wUmVmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmlld0NvbXBvbmVudFR5cGUodHlwZTogVG9vbGJhckl0ZW1UeXBlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSBUb29sYmFySXRlbVR5cGUuZGVmYXVsdCkge1xuICAgICAgICAgICAgcmV0dXJuIFRoZVRvb2xiYXJJdGVtQ29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBUb29sYmFySXRlbVR5cGUuZHJvcGRvd24pIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUb29sYmFyRHJvcGRvd25Db21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRoZVRvb2xiYXJJdGVtQ29tcG9uZW50O1xuICAgIH1cbn1cbiIsIjx0aHktaWNvbi1uYXYgW3N0eWxlLmp1c3RpZnlDb250ZW50XT1cImFsaWduXCI+XG4gICAgPG5nLWNvbnRhaW5lciAjdG9vbGJhckNvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiYWZ0ZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFmdGVyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuPC90aHktaWNvbi1uYXY+XG4iXX0=