@jackuait/blok 0.4.1-beta.1 → 0.4.1-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +138 -17
  2. package/codemod/README.md +45 -7
  3. package/codemod/migrate-editorjs-to-blok.js +960 -92
  4. package/codemod/test.js +780 -77
  5. package/dist/blok.mjs +5 -2
  6. package/dist/chunks/blok-oNSQ3HA6.mjs +13217 -0
  7. package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
  8. package/dist/chunks/i18next-loader-BdNRw4n4.mjs +43 -0
  9. package/dist/{index-CEXLTV6f.mjs → chunks/index-DHgXmfki.mjs} +2 -2
  10. package/dist/chunks/inline-tool-convert-CRqgjRim.mjs +1989 -0
  11. package/dist/chunks/messages-0tDXLuyH.mjs +48 -0
  12. package/dist/chunks/messages-2_xedlYw.mjs +48 -0
  13. package/dist/chunks/messages-AHESHJm_.mjs +48 -0
  14. package/dist/chunks/messages-B5hdXZwA.mjs +48 -0
  15. package/dist/chunks/messages-B5jGUnOy.mjs +48 -0
  16. package/dist/chunks/messages-B5puUm7R.mjs +48 -0
  17. package/dist/chunks/messages-B66ZSDCJ.mjs +48 -0
  18. package/dist/chunks/messages-B9Oba7sq.mjs +48 -0
  19. package/dist/chunks/messages-BA0rcTCY.mjs +48 -0
  20. package/dist/chunks/messages-BBJgd5jG.mjs +48 -0
  21. package/dist/chunks/messages-BPqWKx5Z.mjs +48 -0
  22. package/dist/chunks/messages-Bdv-IkfG.mjs +48 -0
  23. package/dist/chunks/messages-BeUhMpsr.mjs +48 -0
  24. package/dist/chunks/messages-Bf6Y3_GI.mjs +48 -0
  25. package/dist/chunks/messages-BiExzWJv.mjs +48 -0
  26. package/dist/chunks/messages-BlpqL8vG.mjs +48 -0
  27. package/dist/chunks/messages-BmKCChWZ.mjs +48 -0
  28. package/dist/chunks/messages-Bn253WWC.mjs +48 -0
  29. package/dist/chunks/messages-BrJHUxQL.mjs +48 -0
  30. package/dist/chunks/messages-C5b7hr_E.mjs +48 -0
  31. package/dist/chunks/messages-C7I_AVH2.mjs +48 -0
  32. package/dist/chunks/messages-CJoBtXU6.mjs +48 -0
  33. package/dist/chunks/messages-CQj2JU2j.mjs +48 -0
  34. package/dist/chunks/messages-CUZ1x1QD.mjs +48 -0
  35. package/dist/chunks/messages-CUy1vn-b.mjs +48 -0
  36. package/dist/chunks/messages-CVeWVKsV.mjs +48 -0
  37. package/dist/chunks/messages-CXHd9SUK.mjs +48 -0
  38. package/dist/chunks/messages-CbMyJSzS.mjs +48 -0
  39. package/dist/chunks/messages-CbhuIWRJ.mjs +48 -0
  40. package/dist/chunks/messages-CeCjVKMW.mjs +48 -0
  41. package/dist/chunks/messages-Cj-t1bdy.mjs +48 -0
  42. package/dist/chunks/messages-CkFT2gle.mjs +48 -0
  43. package/dist/chunks/messages-Cm9aLHeX.mjs +48 -0
  44. package/dist/chunks/messages-CnvW8Slp.mjs +48 -0
  45. package/dist/chunks/messages-Cr-RJ7YB.mjs +48 -0
  46. package/dist/chunks/messages-CrsJ1TEJ.mjs +48 -0
  47. package/dist/chunks/messages-Cu08aLS3.mjs +48 -0
  48. package/dist/chunks/messages-CvaqJFN-.mjs +48 -0
  49. package/dist/chunks/messages-CyDU5lz9.mjs +48 -0
  50. package/dist/chunks/messages-CySyfkMU.mjs +48 -0
  51. package/dist/chunks/messages-Cyi2AMmz.mjs +48 -0
  52. package/dist/chunks/messages-D00OjS2n.mjs +48 -0
  53. package/dist/chunks/messages-DDLgIPDF.mjs +48 -0
  54. package/dist/chunks/messages-DMQIHGRj.mjs +48 -0
  55. package/dist/chunks/messages-DOlC_Tty.mjs +48 -0
  56. package/dist/chunks/messages-DV6shA9b.mjs +48 -0
  57. package/dist/chunks/messages-DY94ykcE.mjs +48 -0
  58. package/dist/chunks/messages-DbVquYKN.mjs +48 -0
  59. package/dist/chunks/messages-DcKOuncK.mjs +48 -0
  60. package/dist/chunks/messages-Dg92dXZ5.mjs +48 -0
  61. package/dist/chunks/messages-DnbbyJT3.mjs +48 -0
  62. package/dist/chunks/messages-DteYq0rv.mjs +48 -0
  63. package/dist/chunks/messages-GC2PhgV3.mjs +48 -0
  64. package/dist/chunks/messages-JGsXAReJ.mjs +48 -0
  65. package/dist/chunks/messages-JZUhXTuV.mjs +48 -0
  66. package/dist/chunks/messages-LvFKBBPa.mjs +48 -0
  67. package/dist/chunks/messages-NP1myMGI.mjs +48 -0
  68. package/dist/chunks/messages-Q4kc_ZtL.mjs +48 -0
  69. package/dist/chunks/messages-RvMHb2Ht.mjs +48 -0
  70. package/dist/chunks/messages-ftMcCEuO.mjs +48 -0
  71. package/dist/chunks/messages-o24dK6CU.mjs +48 -0
  72. package/dist/chunks/messages-pA5TvcAj.mjs +48 -0
  73. package/dist/chunks/messages-rRSHQDCX.mjs +48 -0
  74. package/dist/chunks/messages-srxrv8Yh.mjs +48 -0
  75. package/dist/chunks/messages-wdqp4610.mjs +48 -0
  76. package/dist/chunks/messages-zS1AXZ0y.mjs +48 -0
  77. package/dist/chunks/messages-zSzDzXej.mjs +48 -0
  78. package/dist/full.mjs +50 -0
  79. package/dist/locales.mjs +228 -0
  80. package/dist/messages-0tDXLuyH.mjs +48 -0
  81. package/dist/messages-2_xedlYw.mjs +48 -0
  82. package/dist/messages-AHESHJm_.mjs +48 -0
  83. package/dist/messages-B5hdXZwA.mjs +48 -0
  84. package/dist/messages-B5jGUnOy.mjs +48 -0
  85. package/dist/messages-B5puUm7R.mjs +48 -0
  86. package/dist/messages-B66ZSDCJ.mjs +48 -0
  87. package/dist/messages-B9Oba7sq.mjs +48 -0
  88. package/dist/messages-BA0rcTCY.mjs +48 -0
  89. package/dist/messages-BBJgd5jG.mjs +48 -0
  90. package/dist/messages-BPqWKx5Z.mjs +48 -0
  91. package/dist/messages-Bdv-IkfG.mjs +48 -0
  92. package/dist/messages-BeUhMpsr.mjs +48 -0
  93. package/dist/messages-Bf6Y3_GI.mjs +48 -0
  94. package/dist/messages-BiExzWJv.mjs +48 -0
  95. package/dist/messages-BlpqL8vG.mjs +48 -0
  96. package/dist/messages-BmKCChWZ.mjs +48 -0
  97. package/dist/messages-Bn253WWC.mjs +48 -0
  98. package/dist/messages-BrJHUxQL.mjs +48 -0
  99. package/dist/messages-C5b7hr_E.mjs +48 -0
  100. package/dist/messages-C7I_AVH2.mjs +48 -0
  101. package/dist/messages-CJoBtXU6.mjs +48 -0
  102. package/dist/messages-CQj2JU2j.mjs +48 -0
  103. package/dist/messages-CUZ1x1QD.mjs +48 -0
  104. package/dist/messages-CUy1vn-b.mjs +48 -0
  105. package/dist/messages-CVeWVKsV.mjs +48 -0
  106. package/dist/messages-CXHd9SUK.mjs +48 -0
  107. package/dist/messages-CbMyJSzS.mjs +48 -0
  108. package/dist/messages-CbhuIWRJ.mjs +48 -0
  109. package/dist/messages-CeCjVKMW.mjs +48 -0
  110. package/dist/messages-Cj-t1bdy.mjs +48 -0
  111. package/dist/messages-CkFT2gle.mjs +48 -0
  112. package/dist/messages-Cm9aLHeX.mjs +48 -0
  113. package/dist/messages-CnvW8Slp.mjs +48 -0
  114. package/dist/messages-Cr-RJ7YB.mjs +48 -0
  115. package/dist/messages-CrsJ1TEJ.mjs +48 -0
  116. package/dist/messages-Cu08aLS3.mjs +48 -0
  117. package/dist/messages-CvaqJFN-.mjs +48 -0
  118. package/dist/messages-CyDU5lz9.mjs +48 -0
  119. package/dist/messages-CySyfkMU.mjs +48 -0
  120. package/dist/messages-Cyi2AMmz.mjs +48 -0
  121. package/dist/messages-D00OjS2n.mjs +48 -0
  122. package/dist/messages-DDLgIPDF.mjs +48 -0
  123. package/dist/messages-DMQIHGRj.mjs +48 -0
  124. package/dist/messages-DOlC_Tty.mjs +48 -0
  125. package/dist/messages-DV6shA9b.mjs +48 -0
  126. package/dist/messages-DY94ykcE.mjs +48 -0
  127. package/dist/messages-DbVquYKN.mjs +48 -0
  128. package/dist/messages-DcKOuncK.mjs +48 -0
  129. package/dist/messages-Dg92dXZ5.mjs +48 -0
  130. package/dist/messages-DnbbyJT3.mjs +48 -0
  131. package/dist/messages-DteYq0rv.mjs +48 -0
  132. package/dist/messages-GC2PhgV3.mjs +48 -0
  133. package/dist/messages-JGsXAReJ.mjs +48 -0
  134. package/dist/messages-JZUhXTuV.mjs +48 -0
  135. package/dist/messages-LvFKBBPa.mjs +48 -0
  136. package/dist/messages-NP1myMGI.mjs +48 -0
  137. package/dist/messages-Q4kc_ZtL.mjs +48 -0
  138. package/dist/messages-RvMHb2Ht.mjs +48 -0
  139. package/dist/messages-ftMcCEuO.mjs +48 -0
  140. package/dist/messages-o24dK6CU.mjs +48 -0
  141. package/dist/messages-pA5TvcAj.mjs +48 -0
  142. package/dist/messages-rRSHQDCX.mjs +48 -0
  143. package/dist/messages-srxrv8Yh.mjs +48 -0
  144. package/dist/messages-wdqp4610.mjs +48 -0
  145. package/dist/messages-zS1AXZ0y.mjs +48 -0
  146. package/dist/messages-zSzDzXej.mjs +48 -0
  147. package/dist/tools.mjs +3117 -0
  148. package/dist/vendor.LICENSE.txt +26 -225
  149. package/package.json +63 -24
  150. package/src/blok.ts +267 -0
  151. package/src/components/__module.ts +139 -0
  152. package/src/components/block/api.ts +155 -0
  153. package/src/components/block/index.ts +1428 -0
  154. package/src/components/block-tunes/block-tune-delete.ts +51 -0
  155. package/src/components/blocks.ts +352 -0
  156. package/src/components/constants/data-attributes.ts +344 -0
  157. package/src/components/constants.ts +76 -0
  158. package/src/components/core.ts +392 -0
  159. package/src/components/dom.ts +773 -0
  160. package/src/components/domIterator.ts +189 -0
  161. package/src/components/errors/critical.ts +5 -0
  162. package/src/components/events/BlockChanged.ts +16 -0
  163. package/src/components/events/BlockHovered.ts +21 -0
  164. package/src/components/events/BlockSettingsClosed.ts +12 -0
  165. package/src/components/events/BlockSettingsOpened.ts +12 -0
  166. package/src/components/events/BlokMobileLayoutToggled.ts +15 -0
  167. package/src/components/events/FakeCursorAboutToBeToggled.ts +17 -0
  168. package/src/components/events/FakeCursorHaveBeenSet.ts +17 -0
  169. package/src/components/events/HistoryStateChanged.ts +19 -0
  170. package/src/components/events/RedactorDomChanged.ts +14 -0
  171. package/src/components/events/index.ts +46 -0
  172. package/src/components/flipper.ts +497 -0
  173. package/src/components/i18n/i18next-loader.ts +84 -0
  174. package/src/components/i18n/lightweight-i18n.ts +86 -0
  175. package/src/components/i18n/locales/TRANSLATION_GUIDELINES.md +113 -0
  176. package/src/components/i18n/locales/am/messages.json +45 -0
  177. package/src/components/i18n/locales/ar/messages.json +45 -0
  178. package/src/components/i18n/locales/az/messages.json +45 -0
  179. package/src/components/i18n/locales/bg/messages.json +45 -0
  180. package/src/components/i18n/locales/bn/messages.json +45 -0
  181. package/src/components/i18n/locales/bs/messages.json +45 -0
  182. package/src/components/i18n/locales/cs/messages.json +45 -0
  183. package/src/components/i18n/locales/da/messages.json +45 -0
  184. package/src/components/i18n/locales/de/messages.json +45 -0
  185. package/src/components/i18n/locales/dv/messages.json +45 -0
  186. package/src/components/i18n/locales/el/messages.json +45 -0
  187. package/src/components/i18n/locales/en/messages.json +45 -0
  188. package/src/components/i18n/locales/es/messages.json +45 -0
  189. package/src/components/i18n/locales/et/messages.json +45 -0
  190. package/src/components/i18n/locales/fa/messages.json +45 -0
  191. package/src/components/i18n/locales/fi/messages.json +45 -0
  192. package/src/components/i18n/locales/fil/messages.json +45 -0
  193. package/src/components/i18n/locales/fr/messages.json +45 -0
  194. package/src/components/i18n/locales/gu/messages.json +45 -0
  195. package/src/components/i18n/locales/he/messages.json +45 -0
  196. package/src/components/i18n/locales/hi/messages.json +45 -0
  197. package/src/components/i18n/locales/hr/messages.json +45 -0
  198. package/src/components/i18n/locales/hu/messages.json +45 -0
  199. package/src/components/i18n/locales/hy/messages.json +45 -0
  200. package/src/components/i18n/locales/id/messages.json +45 -0
  201. package/src/components/i18n/locales/index.ts +231 -0
  202. package/src/components/i18n/locales/it/messages.json +45 -0
  203. package/src/components/i18n/locales/ja/messages.json +45 -0
  204. package/src/components/i18n/locales/ka/messages.json +45 -0
  205. package/src/components/i18n/locales/km/messages.json +45 -0
  206. package/src/components/i18n/locales/kn/messages.json +45 -0
  207. package/src/components/i18n/locales/ko/messages.json +45 -0
  208. package/src/components/i18n/locales/ku/messages.json +45 -0
  209. package/src/components/i18n/locales/lo/messages.json +45 -0
  210. package/src/components/i18n/locales/lt/messages.json +45 -0
  211. package/src/components/i18n/locales/lv/messages.json +45 -0
  212. package/src/components/i18n/locales/mk/messages.json +45 -0
  213. package/src/components/i18n/locales/ml/messages.json +45 -0
  214. package/src/components/i18n/locales/mn/messages.json +45 -0
  215. package/src/components/i18n/locales/mr/messages.json +45 -0
  216. package/src/components/i18n/locales/ms/messages.json +45 -0
  217. package/src/components/i18n/locales/my/messages.json +45 -0
  218. package/src/components/i18n/locales/ne/messages.json +45 -0
  219. package/src/components/i18n/locales/nl/messages.json +45 -0
  220. package/src/components/i18n/locales/no/messages.json +45 -0
  221. package/src/components/i18n/locales/pa/messages.json +45 -0
  222. package/src/components/i18n/locales/pl/messages.json +45 -0
  223. package/src/components/i18n/locales/ps/messages.json +45 -0
  224. package/src/components/i18n/locales/pt/messages.json +45 -0
  225. package/src/components/i18n/locales/ro/messages.json +45 -0
  226. package/src/components/i18n/locales/ru/messages.json +45 -0
  227. package/src/components/i18n/locales/sd/messages.json +45 -0
  228. package/src/components/i18n/locales/si/messages.json +45 -0
  229. package/src/components/i18n/locales/sk/messages.json +45 -0
  230. package/src/components/i18n/locales/sl/messages.json +45 -0
  231. package/src/components/i18n/locales/sq/messages.json +45 -0
  232. package/src/components/i18n/locales/sr/messages.json +45 -0
  233. package/src/components/i18n/locales/sv/messages.json +45 -0
  234. package/src/components/i18n/locales/sw/messages.json +45 -0
  235. package/src/components/i18n/locales/ta/messages.json +45 -0
  236. package/src/components/i18n/locales/te/messages.json +45 -0
  237. package/src/components/i18n/locales/th/messages.json +45 -0
  238. package/src/components/i18n/locales/tr/messages.json +45 -0
  239. package/src/components/i18n/locales/ug/messages.json +45 -0
  240. package/src/components/i18n/locales/uk/messages.json +45 -0
  241. package/src/components/i18n/locales/ur/messages.json +45 -0
  242. package/src/components/i18n/locales/vi/messages.json +45 -0
  243. package/src/components/i18n/locales/yi/messages.json +45 -0
  244. package/src/components/i18n/locales/zh/messages.json +45 -0
  245. package/src/components/icons/index.ts +242 -0
  246. package/src/components/inline-tools/inline-tool-bold.ts +2213 -0
  247. package/src/components/inline-tools/inline-tool-convert.ts +141 -0
  248. package/src/components/inline-tools/inline-tool-italic.ts +500 -0
  249. package/src/components/inline-tools/inline-tool-link.ts +539 -0
  250. package/src/components/modules/api/blocks.ts +377 -0
  251. package/src/components/modules/api/caret.ts +125 -0
  252. package/src/components/modules/api/events.ts +51 -0
  253. package/src/components/modules/api/history.ts +73 -0
  254. package/src/components/modules/api/i18n.ts +35 -0
  255. package/src/components/modules/api/index.ts +39 -0
  256. package/src/components/modules/api/inlineToolbar.ts +33 -0
  257. package/src/components/modules/api/listeners.ts +56 -0
  258. package/src/components/modules/api/notifier.ts +46 -0
  259. package/src/components/modules/api/readonly.ts +39 -0
  260. package/src/components/modules/api/sanitizer.ts +30 -0
  261. package/src/components/modules/api/saver.ts +52 -0
  262. package/src/components/modules/api/selection.ts +48 -0
  263. package/src/components/modules/api/styles.ts +72 -0
  264. package/src/components/modules/api/toolbar.ts +79 -0
  265. package/src/components/modules/api/tools.ts +16 -0
  266. package/src/components/modules/api/tooltip.ts +67 -0
  267. package/src/components/modules/api/ui.ts +36 -0
  268. package/src/components/modules/blockEvents.ts +1591 -0
  269. package/src/components/modules/blockManager.ts +1356 -0
  270. package/src/components/modules/blockSelection.ts +708 -0
  271. package/src/components/modules/caret.ts +853 -0
  272. package/src/components/modules/crossBlockSelection.ts +329 -0
  273. package/src/components/modules/dragManager.ts +1204 -0
  274. package/src/components/modules/history.ts +1098 -0
  275. package/src/components/modules/i18n.ts +332 -0
  276. package/src/components/modules/index.ts +139 -0
  277. package/src/components/modules/modificationsObserver.ts +147 -0
  278. package/src/components/modules/paste.ts +1092 -0
  279. package/src/components/modules/readonly.ts +136 -0
  280. package/src/components/modules/rectangleSelection.ts +711 -0
  281. package/src/components/modules/renderer.ts +155 -0
  282. package/src/components/modules/saver.ts +283 -0
  283. package/src/components/modules/toolbar/blockSettings.ts +781 -0
  284. package/src/components/modules/toolbar/index.ts +1315 -0
  285. package/src/components/modules/toolbar/inline.ts +956 -0
  286. package/src/components/modules/tools.ts +625 -0
  287. package/src/components/modules/ui.ts +1283 -0
  288. package/src/components/polyfills.ts +113 -0
  289. package/src/components/selection.ts +1179 -0
  290. package/src/components/tools/base.ts +301 -0
  291. package/src/components/tools/block.ts +339 -0
  292. package/src/components/tools/collection.ts +67 -0
  293. package/src/components/tools/factory.ts +138 -0
  294. package/src/components/tools/inline.ts +71 -0
  295. package/src/components/tools/tune.ts +33 -0
  296. package/src/components/ui/toolbox.ts +601 -0
  297. package/src/components/utils/announcer.ts +205 -0
  298. package/src/components/utils/api.ts +20 -0
  299. package/src/components/utils/bem.ts +26 -0
  300. package/src/components/utils/blocks.ts +284 -0
  301. package/src/components/utils/caret.ts +1067 -0
  302. package/src/components/utils/data-model-transform.ts +382 -0
  303. package/src/components/utils/events.ts +117 -0
  304. package/src/components/utils/keyboard.ts +60 -0
  305. package/src/components/utils/listeners.ts +296 -0
  306. package/src/components/utils/mutations.ts +39 -0
  307. package/src/components/utils/notifier/draw.ts +190 -0
  308. package/src/components/utils/notifier/index.ts +66 -0
  309. package/src/components/utils/notifier/types.ts +1 -0
  310. package/src/components/utils/notifier.ts +77 -0
  311. package/src/components/utils/placeholder.ts +140 -0
  312. package/src/components/utils/popover/components/hint/hint.const.ts +10 -0
  313. package/src/components/utils/popover/components/hint/hint.ts +46 -0
  314. package/src/components/utils/popover/components/hint/index.ts +6 -0
  315. package/src/components/utils/popover/components/popover-header/index.ts +2 -0
  316. package/src/components/utils/popover/components/popover-header/popover-header.const.ts +8 -0
  317. package/src/components/utils/popover/components/popover-header/popover-header.ts +80 -0
  318. package/src/components/utils/popover/components/popover-header/popover-header.types.ts +14 -0
  319. package/src/components/utils/popover/components/popover-item/index.ts +13 -0
  320. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.const.ts +50 -0
  321. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.ts +680 -0
  322. package/src/components/utils/popover/components/popover-item/popover-item-html/popover-item-html.const.ts +14 -0
  323. package/src/components/utils/popover/components/popover-item/popover-item-html/popover-item-html.ts +136 -0
  324. package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.const.ts +20 -0
  325. package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.ts +117 -0
  326. package/src/components/utils/popover/components/popover-item/popover-item.ts +186 -0
  327. package/src/components/utils/popover/components/search-input/index.ts +2 -0
  328. package/src/components/utils/popover/components/search-input/search-input.const.ts +8 -0
  329. package/src/components/utils/popover/components/search-input/search-input.ts +178 -0
  330. package/src/components/utils/popover/components/search-input/search-input.types.ts +59 -0
  331. package/src/components/utils/popover/index.ts +13 -0
  332. package/src/components/utils/popover/popover-abstract.ts +457 -0
  333. package/src/components/utils/popover/popover-desktop.ts +676 -0
  334. package/src/components/utils/popover/popover-inline.ts +338 -0
  335. package/src/components/utils/popover/popover-mobile.ts +201 -0
  336. package/src/components/utils/popover/popover.const.ts +81 -0
  337. package/src/components/utils/popover/utils/popover-states-history.ts +72 -0
  338. package/src/components/utils/promise-queue.ts +43 -0
  339. package/src/components/utils/sanitizer.ts +537 -0
  340. package/src/components/utils/scroll-locker.ts +87 -0
  341. package/src/components/utils/shortcut.ts +231 -0
  342. package/src/components/utils/shortcuts.ts +113 -0
  343. package/src/components/utils/tools.ts +110 -0
  344. package/src/components/utils/tooltip.ts +591 -0
  345. package/src/components/utils/tw.ts +241 -0
  346. package/src/components/utils.ts +1081 -0
  347. package/src/env.d.ts +13 -0
  348. package/src/full.ts +69 -0
  349. package/src/locales.ts +51 -0
  350. package/src/stories/Block.stories.ts +498 -0
  351. package/src/stories/EditorModes.stories.ts +505 -0
  352. package/src/stories/Header.stories.ts +137 -0
  353. package/src/stories/InlineToolbar.stories.ts +498 -0
  354. package/src/stories/List.stories.ts +259 -0
  355. package/src/stories/Notifier.stories.ts +340 -0
  356. package/src/stories/Paragraph.stories.ts +112 -0
  357. package/src/stories/Placeholder.stories.ts +319 -0
  358. package/src/stories/Popover.stories.ts +844 -0
  359. package/src/stories/Selection.stories.ts +250 -0
  360. package/src/stories/StubBlock.stories.ts +156 -0
  361. package/src/stories/Toolbar.stories.ts +223 -0
  362. package/src/stories/Toolbox.stories.ts +166 -0
  363. package/src/stories/Tooltip.stories.ts +198 -0
  364. package/src/stories/helpers.ts +463 -0
  365. package/src/styles/main.css +123 -0
  366. package/src/tools/header/index.ts +646 -0
  367. package/src/tools/index.ts +45 -0
  368. package/src/tools/list/index.ts +1819 -0
  369. package/src/tools/paragraph/index.ts +412 -0
  370. package/src/tools/stub/index.ts +107 -0
  371. package/src/types-internal/blok-modules.d.ts +87 -0
  372. package/src/types-internal/html-janitor.d.ts +28 -0
  373. package/src/types-internal/module-config.d.ts +11 -0
  374. package/src/variants/all-locales.ts +155 -0
  375. package/src/variants/blok-maximum.ts +20 -0
  376. package/src/variants/blok-minimum.ts +243 -0
  377. package/types/api/blocks.d.ts +9 -1
  378. package/types/api/history.d.ts +7 -0
  379. package/types/api/i18n.d.ts +22 -3
  380. package/types/api/selection.d.ts +6 -0
  381. package/types/api/styles.d.ts +23 -10
  382. package/types/configs/blok-config.d.ts +29 -0
  383. package/types/configs/i18n-config.d.ts +52 -2
  384. package/types/configs/i18n-dictionary.d.ts +16 -90
  385. package/types/data-attributes.d.ts +170 -0
  386. package/types/data-formats/output-data.d.ts +15 -0
  387. package/types/full.d.ts +80 -0
  388. package/types/index.d.ts +29 -13
  389. package/types/locales.d.ts +59 -0
  390. package/types/tools/adapters/inline-tool-adapter.d.ts +10 -0
  391. package/types/tools/block-tool.d.ts +9 -0
  392. package/types/tools/header.d.ts +18 -0
  393. package/types/tools/index.d.ts +1 -0
  394. package/types/tools/list.d.ts +91 -0
  395. package/types/tools/paragraph.d.ts +71 -0
  396. package/types/tools/tool-settings.d.ts +92 -6
  397. package/types/tools/tool.d.ts +6 -0
  398. package/types/tools-entry.d.ts +49 -0
  399. package/types/utils/popover/popover-item.d.ts +18 -5
  400. package/types/utils/popover/popover.d.ts +7 -0
  401. package/dist/blok-C8XbyLHh.mjs +0 -25795
  402. package/dist/blok.umd.js +0 -181
@@ -0,0 +1,591 @@
1
+ import { DATA_ATTR, TOOLTIP_INTERFACE_VALUE } from '../constants';
2
+ import { twJoin } from './tw';
3
+
4
+ /**
5
+ * Tooltip supported content
6
+ */
7
+ export type TooltipContent = HTMLElement | DocumentFragment | Node | string;
8
+
9
+ /**
10
+ * Base options interface for tooltips
11
+ */
12
+ export interface TooltipOptions {
13
+ /**
14
+ * Tooltip placement: top|bottom|left|right
15
+ */
16
+ placement?: string;
17
+
18
+ /**
19
+ * Tooltip top margin
20
+ */
21
+ marginTop?: number;
22
+
23
+ /**
24
+ * Tooltip left margin
25
+ */
26
+ marginLeft?: number;
27
+
28
+ /**
29
+ * Tooltip right margin
30
+ */
31
+ marginRight?: number;
32
+
33
+ /**
34
+ * Tooltip bottom margin
35
+ */
36
+ marginBottom?: number;
37
+
38
+ /**
39
+ * Timout before showing
40
+ */
41
+ delay?: number;
42
+ }
43
+
44
+ const DEFAULT_OFFSET = 10;
45
+ const TOOLTIP_ROLE = 'tooltip';
46
+ const ARIA_HIDDEN_ATTRIBUTE = 'aria-hidden';
47
+ const ARIA_HIDDEN_FALSE = 'false';
48
+ const ARIA_HIDDEN_TRUE = 'true';
49
+ const VISIBILITY_PROPERTY = 'visibility';
50
+ const VISIBILITY_VISIBLE = 'visible';
51
+ const VISIBILITY_HIDDEN = 'hidden';
52
+
53
+ type CSSTooltipClasses = {
54
+ tooltip: string | string[];
55
+ tooltipContent: string | string[];
56
+ tooltipShown: string | string[];
57
+ placement: {
58
+ left: string | string[];
59
+ bottom: string | string[];
60
+ right: string | string[];
61
+ top: string | string[];
62
+ };
63
+ };
64
+
65
+ /**
66
+ * Tiny any beautiful tooltips module.
67
+ *
68
+ * Can be showed near passed Element with any specified HTML content
69
+ */
70
+ class Tooltip {
71
+ /**
72
+ * Tooltip CSS classes
73
+ * @returns {object} CSS class names
74
+ */
75
+ private get CSS(): CSSTooltipClasses {
76
+ return {
77
+ tooltip: twJoin(
78
+ 'absolute z-overlay top-0 left-0',
79
+ 'bg-tooltip-bg opacity-0',
80
+ 'select-none pointer-events-none',
81
+ 'transition-[opacity,transform] duration-[50ms,70ms] ease-in',
82
+ 'rounded-lg shadow-tooltip',
83
+ 'will-change-[opacity,top,left]',
84
+ 'before:content-[\'\'] before:absolute before:inset-0 before:bg-tooltip-bg before:-z-10 before:rounded-lg',
85
+ 'mobile:hidden'
86
+ ).split(' '),
87
+ tooltipContent: twJoin(
88
+ 'px-2.5 py-1.5',
89
+ 'text-tooltip-font text-xs text-center',
90
+ 'tracking-[0.02em] leading-[1em]'
91
+ ).split(' '),
92
+ tooltipShown: ['opacity-100', 'transform-none'],
93
+ placement: {
94
+ left: ['-translate-x-[5px]'],
95
+ bottom: ['translate-y-[5px]'],
96
+ right: ['translate-x-[5px]'],
97
+ top: ['-translate-y-[5px]'],
98
+ },
99
+ };
100
+ }
101
+
102
+ /**
103
+ * Module nodes
104
+ */
105
+ private nodes: {
106
+ wrapper: HTMLElement | null;
107
+ content: HTMLElement | null;
108
+ } = {
109
+ wrapper: null,
110
+ content: null,
111
+ };
112
+
113
+ /**
114
+ * Appearance state
115
+ */
116
+ private showed: boolean = false;
117
+
118
+ /**
119
+ * Offset above the Tooltip
120
+ */
121
+ private offsetTop: number = DEFAULT_OFFSET;
122
+
123
+ /**
124
+ * Offset at the left from the Tooltip
125
+ */
126
+ private offsetLeft: number = DEFAULT_OFFSET;
127
+
128
+ /**
129
+ * Offset at the right from the Tooltip
130
+ */
131
+ private offsetRight: number = DEFAULT_OFFSET;
132
+
133
+ /**
134
+ * Store timeout before showing to clear it on hide
135
+ */
136
+ private showingTimeout: ReturnType<typeof setTimeout> | null = null;
137
+
138
+ /**
139
+ * MutationObserver for watching tooltip visibility changes
140
+ */
141
+ private ariaObserver: MutationObserver | null = null;
142
+
143
+ /**
144
+ * Static singleton instance
145
+ */
146
+ private static instance: Tooltip | null = null;
147
+
148
+ /**
149
+ * Get singleton instance
150
+ */
151
+ public static getInstance(): Tooltip {
152
+ if (!Tooltip.instance) {
153
+ Tooltip.instance = new Tooltip();
154
+ }
155
+
156
+ return Tooltip.instance;
157
+ }
158
+
159
+ /**
160
+ * Module constructor
161
+ */
162
+ private constructor() {
163
+ this.prepare();
164
+
165
+ window.addEventListener('scroll', this.handleWindowScroll, { passive: true });
166
+ }
167
+
168
+ /**
169
+ * Show Tooltip near passed element with specified HTML content
170
+ * @param {HTMLElement} element - target element to place Tooltip near that
171
+ * @param {TooltipContent} content — any HTML Element of String that will be used as content
172
+ * @param {TooltipOptions} options — Available options {@link TooltipOptions}
173
+ */
174
+ public show(element: HTMLElement, content: TooltipContent, options: TooltipOptions = {}): void {
175
+ if (!this.nodes.wrapper) {
176
+ this.prepare();
177
+ }
178
+
179
+ const basicOptions = {
180
+ placement: 'bottom',
181
+ marginTop: 0,
182
+ marginLeft: 0,
183
+ marginRight: 0,
184
+ marginBottom: 0,
185
+ delay: 70,
186
+ };
187
+ const showingOptions = Object.assign(basicOptions, options);
188
+
189
+ if (!this.nodes.content) {
190
+ return;
191
+ }
192
+
193
+ this.nodes.content.innerHTML = '';
194
+ this.nodes.content.appendChild(this.createContentNode(content));
195
+
196
+ if (!this.nodes.wrapper) {
197
+ return;
198
+ }
199
+
200
+ // Flatten the placement classes (each can be a string or array) before removing
201
+ const placementClasses = Object.values(this.CSS.placement).flatMap(cls => Array.isArray(cls) ? cls : [cls]);
202
+
203
+ this.nodes.wrapper.classList.remove(...placementClasses);
204
+
205
+ switch (showingOptions.placement) {
206
+ case 'top':
207
+ this.placeTop(element, showingOptions);
208
+ break;
209
+
210
+ case 'left':
211
+ this.placeLeft(element, showingOptions);
212
+ break;
213
+
214
+ case 'right':
215
+ this.placeRight(element, showingOptions);
216
+ break;
217
+
218
+ case 'bottom':
219
+ default:
220
+ this.placeBottom(element, showingOptions);
221
+ break;
222
+ }
223
+
224
+ if (showingOptions && showingOptions.delay) {
225
+ this.showingTimeout = setTimeout(() => {
226
+ if (this.nodes.wrapper) {
227
+ const classes = Array.isArray(this.CSS.tooltipShown) ? this.CSS.tooltipShown : [this.CSS.tooltipShown];
228
+
229
+ this.nodes.wrapper.classList.add(...classes);
230
+ this.updateTooltipVisibility();
231
+ }
232
+ this.showed = true;
233
+ }, showingOptions.delay);
234
+
235
+ return;
236
+ }
237
+
238
+ if (this.nodes.wrapper) {
239
+ const classes = Array.isArray(this.CSS.tooltipShown) ? this.CSS.tooltipShown : [this.CSS.tooltipShown];
240
+
241
+ this.nodes.wrapper.classList.add(...classes);
242
+ this.updateTooltipVisibility();
243
+ }
244
+ this.showed = true;
245
+ }
246
+
247
+ /**
248
+ * Prepare tooltip content node
249
+ * @param {TooltipContent} content - tooltip content (Node or string)
250
+ */
251
+ private createContentNode(content: TooltipContent): Node {
252
+ if (typeof content === 'string') {
253
+ return document.createTextNode(content);
254
+ }
255
+
256
+ if (content instanceof Node) {
257
+ return content;
258
+ }
259
+
260
+ throw Error('[Blok Tooltip] Wrong type of «content» passed. It should be an instance of Node or String. ' +
261
+ 'But ' + typeof content + ' given.');
262
+ }
263
+
264
+ /**
265
+ * Hide toolbox tooltip and clean content
266
+ */
267
+ public hide(): void {
268
+ /**
269
+ * Cancel any pending show timeout when hiding.
270
+ * This prevents the tooltip from appearing after the user has already left the element.
271
+ */
272
+ if (this.showingTimeout) {
273
+ clearTimeout(this.showingTimeout);
274
+ this.showingTimeout = null;
275
+ }
276
+
277
+ if (this.nodes.wrapper) {
278
+ const classes = Array.isArray(this.CSS.tooltipShown) ? this.CSS.tooltipShown : [this.CSS.tooltipShown];
279
+
280
+ this.nodes.wrapper.classList.remove(...classes);
281
+ this.updateTooltipVisibility();
282
+ }
283
+ this.showed = false;
284
+ }
285
+
286
+ /**
287
+ * Mouseover/Mouseleave decorator
288
+ * @param {HTMLElement} element - target element to place Tooltip near that
289
+ * @param {TooltipContent} content — any HTML Element of String that will be used as content
290
+ * @param {TooltipOptions} options — Available options {@link TooltipOptions}
291
+ */
292
+ public onHover(element: HTMLElement, content: TooltipContent, options: TooltipOptions = {}): void {
293
+ element.addEventListener('mouseenter', () => {
294
+ /**
295
+ * Don't show tooltip if any Popover is currently open,
296
+ * unless the element is inside the open popover (e.g., inline toolbar items)
297
+ * This prevents tooltips from appearing over open menus while still allowing
298
+ * tooltips on items within the popover itself
299
+ */
300
+ const openedPopover = document.querySelector('[data-blok-popover-opened="true"]');
301
+
302
+ if (openedPopover !== null && !openedPopover.contains(element)) {
303
+ return;
304
+ }
305
+
306
+ this.show(element, content, options);
307
+ });
308
+ element.addEventListener('mouseleave', () => {
309
+ this.hide();
310
+ });
311
+ }
312
+
313
+ /**
314
+ * Release DOM and event listeners
315
+ */
316
+ public destroy(): void {
317
+ this.ariaObserver?.disconnect();
318
+ this.ariaObserver = null;
319
+
320
+ if (this.nodes.wrapper) {
321
+ this.nodes.wrapper.remove();
322
+ }
323
+
324
+ window.removeEventListener('scroll', this.handleWindowScroll);
325
+
326
+ Tooltip.instance = null;
327
+ }
328
+
329
+ /**
330
+ * Hide tooltip when page is scrolled
331
+ */
332
+ private handleWindowScroll = (): void => {
333
+ if (this.showed) {
334
+ this.hide();
335
+ }
336
+ };
337
+
338
+ /**
339
+ * Module Preparation method
340
+ */
341
+ private prepare(): void {
342
+ this.nodes.wrapper = this.make('div', this.CSS.tooltip);
343
+ this.nodes.wrapper.setAttribute(DATA_ATTR.interface, TOOLTIP_INTERFACE_VALUE);
344
+ this.nodes.wrapper.setAttribute('data-blok-testid', 'tooltip');
345
+ this.nodes.content = this.make('div', this.CSS.tooltipContent);
346
+ this.nodes.content.setAttribute('data-blok-testid', 'tooltip-content');
347
+
348
+ if (this.nodes.wrapper && this.nodes.content) {
349
+ this.append(this.nodes.wrapper, this.nodes.content);
350
+ this.append(document.body, this.nodes.wrapper);
351
+ this.ensureTooltipAttributes();
352
+ }
353
+ }
354
+
355
+ /**
356
+ * Update tooltip visibility based on shown state
357
+ */
358
+ private updateTooltipVisibility(): void {
359
+ if (!this.nodes.wrapper) {
360
+ return;
361
+ }
362
+
363
+ const shownClass = Array.isArray(this.CSS.tooltipShown) ? this.CSS.tooltipShown[0] : this.CSS.tooltipShown;
364
+ const isShown = this.nodes.wrapper.classList.contains(shownClass);
365
+
366
+ this.nodes.wrapper.style.setProperty(VISIBILITY_PROPERTY, isShown ? VISIBILITY_VISIBLE : VISIBILITY_HIDDEN);
367
+ this.nodes.wrapper.setAttribute(ARIA_HIDDEN_ATTRIBUTE, isShown ? ARIA_HIDDEN_FALSE : ARIA_HIDDEN_TRUE);
368
+ this.nodes.wrapper.setAttribute('data-blok-shown', isShown ? 'true' : 'false');
369
+ }
370
+
371
+ /**
372
+ * Watch tooltip visibility changes for accessibility
373
+ */
374
+ private watchTooltipVisibility(): void {
375
+ if (!this.nodes.wrapper) {
376
+ return;
377
+ }
378
+
379
+ this.ariaObserver?.disconnect();
380
+
381
+ this.updateTooltipVisibility();
382
+
383
+ this.ariaObserver = new MutationObserver(() => {
384
+ this.updateTooltipVisibility();
385
+ });
386
+
387
+ this.ariaObserver.observe(this.nodes.wrapper, {
388
+ attributes: true,
389
+ attributeFilter: [ 'class' ],
390
+ });
391
+ }
392
+
393
+ /**
394
+ * Ensure tooltip has proper accessibility attributes
395
+ */
396
+ private ensureTooltipAttributes(): void {
397
+ if (!this.nodes.wrapper) {
398
+ return;
399
+ }
400
+
401
+ if (!this.nodes.wrapper.hasAttribute(DATA_ATTR.interface) || this.nodes.wrapper.getAttribute(DATA_ATTR.interface) !== TOOLTIP_INTERFACE_VALUE) {
402
+ this.nodes.wrapper.setAttribute(DATA_ATTR.interface, TOOLTIP_INTERFACE_VALUE);
403
+ }
404
+
405
+ this.nodes.wrapper.setAttribute('role', TOOLTIP_ROLE);
406
+ this.watchTooltipVisibility();
407
+ }
408
+
409
+
410
+
411
+ /**
412
+ * Calculates element coords and moves tooltip bottom of the element
413
+ * @param {HTMLElement} element - target element
414
+ * @param {TooltipOptions} showingOptions - placement options
415
+ */
416
+ private placeBottom(element: HTMLElement, showingOptions: TooltipOptions): void {
417
+ if (!this.nodes.wrapper) {
418
+ return;
419
+ }
420
+
421
+ const elementCoords = element.getBoundingClientRect();
422
+ const left = elementCoords.left + element.clientWidth / 2 - this.nodes.wrapper.offsetWidth / 2;
423
+ const top = elementCoords.bottom + this.getScrollTop() + this.offsetTop + (showingOptions.marginTop ?? 0);
424
+
425
+ this.applyPlacement('bottom', left, top);
426
+ }
427
+
428
+ /**
429
+ * Calculates element coords and moves tooltip top of the element
430
+ * @param {HTMLElement} element - target element
431
+ * @param {TooltipOptions} _showingOptions - placement options (unused for top placement)
432
+ */
433
+ private placeTop(element: HTMLElement, _showingOptions: TooltipOptions): void {
434
+ if (!this.nodes.wrapper) {
435
+ return;
436
+ }
437
+
438
+ const elementCoords = element.getBoundingClientRect();
439
+ const left = elementCoords.left + element.clientWidth / 2 - this.nodes.wrapper.offsetWidth / 2;
440
+ const top = elementCoords.top + this.getScrollTop() - this.nodes.wrapper.clientHeight - this.offsetTop;
441
+
442
+ this.applyPlacement('top', left, top);
443
+ }
444
+
445
+ /**
446
+ * Calculates element coords and moves tooltip left of the element
447
+ * @param {HTMLElement} element - target element
448
+ * @param {TooltipOptions} showingOptions - placement options
449
+ */
450
+ private placeLeft(element: HTMLElement, showingOptions: TooltipOptions): void {
451
+ if (!this.nodes.wrapper) {
452
+ return;
453
+ }
454
+
455
+ const elementCoords = element.getBoundingClientRect();
456
+ const left = elementCoords.left - this.nodes.wrapper.offsetWidth - this.offsetLeft - (showingOptions.marginLeft ?? 0);
457
+ const top = elementCoords.top + this.getScrollTop() + element.clientHeight / 2 - this.nodes.wrapper.offsetHeight / 2;
458
+
459
+ this.applyPlacement('left', left, top);
460
+ }
461
+
462
+ /**
463
+ * Calculates element coords and moves tooltip right of the element
464
+ * @param {HTMLElement} element - target element
465
+ * @param {TooltipOptions} showingOptions - placement options
466
+ */
467
+ private placeRight(element: HTMLElement, showingOptions: TooltipOptions): void {
468
+ if (!this.nodes.wrapper) {
469
+ return;
470
+ }
471
+
472
+ const elementCoords = element.getBoundingClientRect();
473
+ const left = elementCoords.right + this.offsetRight + (showingOptions.marginRight ?? 0);
474
+ const top = elementCoords.top + this.getScrollTop() + element.clientHeight / 2 - this.nodes.wrapper.offsetHeight / 2;
475
+
476
+ this.applyPlacement('right', left, top);
477
+ }
478
+
479
+ /**
480
+ * Set wrapper position
481
+ * @param {string} place - placement direction
482
+ * @param {number} left - left position in pixels
483
+ * @param {number} top - top position in pixels
484
+ */
485
+ private applyPlacement(place: 'top' | 'bottom' | 'left' | 'right', left: number, top: number): void {
486
+ if (!this.nodes.wrapper) {
487
+ return;
488
+ }
489
+
490
+ const classes = Array.isArray(this.CSS.placement[place]) ? this.CSS.placement[place] : [this.CSS.placement[place]];
491
+
492
+ this.nodes.wrapper.classList.add(...classes);
493
+ this.nodes.wrapper.setAttribute('data-blok-placement', place);
494
+
495
+ this.nodes.wrapper.style.left = `${left}px`;
496
+ this.nodes.wrapper.style.top = `${top}px`;
497
+ }
498
+
499
+ /**
500
+ * Get current page vertical scroll offset
501
+ */
502
+ private getScrollTop(): number {
503
+ if (typeof window.scrollY === 'number') {
504
+ return window.scrollY;
505
+ }
506
+
507
+ return document.documentElement?.scrollTop ?? document.body.scrollTop ?? 0;
508
+ }
509
+
510
+ /**
511
+ * Helper for making Elements with classname and attributes
512
+ * @param {string} tagName - new Element tag name
513
+ * @param {Array<string>|string} classNames - list or name of CSS classname(s)
514
+ * @param {object} attributes - any attributes
515
+ * @returns {HTMLElement}
516
+ */
517
+ private make(tagName: string, classNames: string | string[] | null = null, attributes: Record<string, unknown> = {}): HTMLElement {
518
+ const el = document.createElement(tagName);
519
+
520
+ if (Array.isArray(classNames)) {
521
+ el.classList.add(...classNames);
522
+ }
523
+
524
+ if (typeof classNames === 'string') {
525
+ el.classList.add(classNames);
526
+ }
527
+
528
+ for (const attrName in attributes) {
529
+ if (Object.prototype.hasOwnProperty.call(attributes, attrName)) {
530
+ (el as unknown as Record<string, unknown>)[attrName] = attributes[attrName];
531
+ }
532
+ }
533
+
534
+ return el;
535
+ }
536
+
537
+ /**
538
+ * Append one or several elements to the parent
539
+ * @param {Element|DocumentFragment} parent - where to append
540
+ * @param {Element|Element[]} elements - element or elements list
541
+ */
542
+ private append(parent: Element | DocumentFragment, elements: Element | Element[] | DocumentFragment): void {
543
+ if (Array.isArray(elements)) {
544
+ elements.forEach((el) => parent.appendChild(el));
545
+ } else {
546
+ parent.appendChild(elements);
547
+ }
548
+ }
549
+
550
+ }
551
+
552
+ /**
553
+ * Get singleton tooltip instance
554
+ */
555
+ const getTooltip = (): Tooltip => {
556
+ return Tooltip.getInstance();
557
+ };
558
+
559
+ /**
560
+ * Show tooltip near element with specified content
561
+ * @param {HTMLElement} element - target element to place tooltip near
562
+ * @param {TooltipContent} content - tooltip content
563
+ * @param {TooltipOptions} options - tooltip options
564
+ */
565
+ export const show = (element: HTMLElement, content: TooltipContent, options?: TooltipOptions): void => {
566
+ getTooltip().show(element, content, options ?? {});
567
+ };
568
+
569
+ /**
570
+ * Hide tooltip
571
+ */
572
+ export const hide = (): void => {
573
+ getTooltip().hide();
574
+ };
575
+
576
+ /**
577
+ * Show tooltip on hover (mouseenter/mouseleave)
578
+ * @param {HTMLElement} element - target element to place tooltip near
579
+ * @param {TooltipContent} content - tooltip content
580
+ * @param {TooltipOptions} options - tooltip options
581
+ */
582
+ export const onHover = (element: HTMLElement, content: TooltipContent, options?: TooltipOptions): void => {
583
+ getTooltip().onHover(element, content, options ?? {});
584
+ };
585
+
586
+ /**
587
+ * Destroy tooltip instance and clean up
588
+ */
589
+ export const destroy = (): void => {
590
+ getTooltip().destroy();
591
+ };