@shelamkoff/rector 1.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 (668) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +17 -0
  3. package/README.md +23 -0
  4. package/THIRD_PARTY_LICENSES.txt +298 -0
  5. package/dist/I18n.d.ts +1 -0
  6. package/dist/core/Block.d.ts +110 -0
  7. package/dist/core/Block.js +390 -0
  8. package/dist/core/BlockAnimator.d.ts +39 -0
  9. package/dist/core/BlockAnimator.js +106 -0
  10. package/dist/core/BlockManager.d.ts +163 -0
  11. package/dist/core/BlockManager.js +640 -0
  12. package/dist/core/BlockOperations.d.ts +67 -0
  13. package/dist/core/BlockOperations.js +238 -0
  14. package/dist/core/ChangeNotifier.d.ts +15 -0
  15. package/dist/core/ChangeNotifier.js +55 -0
  16. package/dist/core/CommandDispatcher.d.ts +52 -0
  17. package/dist/core/CommandDispatcher.js +208 -0
  18. package/dist/core/CrossBlockSelection.d.ts +30 -0
  19. package/dist/core/CrossBlockSelection.js +74 -0
  20. package/dist/core/Diagnostics.d.ts +23 -0
  21. package/dist/core/Diagnostics.js +62 -0
  22. package/dist/core/DocumentSchema.d.ts +29 -0
  23. package/dist/core/DocumentSchema.js +147 -0
  24. package/dist/core/DocumentSnapshotStore.d.ts +34 -0
  25. package/dist/core/DocumentSnapshotStore.js +153 -0
  26. package/dist/core/DragManager.d.ts +17 -0
  27. package/dist/core/DragManager.js +223 -0
  28. package/dist/core/EditorFacade.d.ts +154 -0
  29. package/dist/core/EditorFacade.js +361 -0
  30. package/dist/core/EditorHolderOwnership.d.ts +12 -0
  31. package/dist/core/EditorHolderOwnership.js +28 -0
  32. package/dist/core/I18n.d.ts +147 -0
  33. package/dist/core/I18n.js +296 -0
  34. package/dist/core/InlinePatternMatcher.d.ts +26 -0
  35. package/dist/core/InlinePatternMatcher.js +267 -0
  36. package/dist/core/InlinePluginRegistry.d.ts +55 -0
  37. package/dist/core/InlinePluginRegistry.js +128 -0
  38. package/dist/core/KeyboardManager.d.ts +17 -0
  39. package/dist/core/KeyboardManager.js +231 -0
  40. package/dist/core/LifecycleScope.d.ts +19 -0
  41. package/dist/core/LifecycleScope.js +41 -0
  42. package/dist/core/MouseSelectionManager.d.ts +30 -0
  43. package/dist/core/MouseSelectionManager.js +307 -0
  44. package/dist/core/PluginOwnership.d.ts +9 -0
  45. package/dist/core/PluginOwnership.js +40 -0
  46. package/dist/core/PopupManager.d.ts +50 -0
  47. package/dist/core/PopupManager.js +183 -0
  48. package/dist/core/PreservedBlockPlugin.d.ts +11 -0
  49. package/dist/core/PreservedBlockPlugin.js +42 -0
  50. package/dist/core/PublicEditorApi.d.ts +82 -0
  51. package/dist/core/PublicEditorApi.js +158 -0
  52. package/dist/core/SelectionManager.d.ts +50 -0
  53. package/dist/core/SelectionManager.js +205 -0
  54. package/dist/core/ShortcutRegistry.d.ts +29 -0
  55. package/dist/core/ShortcutRegistry.js +106 -0
  56. package/dist/core/SlashCommands.d.ts +34 -0
  57. package/dist/core/SlashCommands.js +483 -0
  58. package/dist/core/StyleInjector.d.ts +1 -0
  59. package/dist/core/StyleInjector.js +1 -0
  60. package/dist/core/Tooltip.d.ts +17 -0
  61. package/dist/core/Tooltip.js +60 -0
  62. package/dist/core/TriggerManager.d.ts +17 -0
  63. package/dist/core/TriggerManager.js +159 -0
  64. package/dist/core/TypeSelector.d.ts +31 -0
  65. package/dist/core/TypeSelector.js +464 -0
  66. package/dist/core/UndoManager.d.ts +72 -0
  67. package/dist/core/UndoManager.js +383 -0
  68. package/dist/core/block-settings-menu/BlockActions.d.ts +81 -0
  69. package/dist/core/block-settings-menu/BlockActions.js +233 -0
  70. package/dist/core/block-settings-menu/BlockSettingsMenu.d.ts +46 -0
  71. package/dist/core/block-settings-menu/BlockSettingsMenu.js +205 -0
  72. package/dist/core/block-settings-menu/MenuBuilder.d.ts +43 -0
  73. package/dist/core/block-settings-menu/MenuBuilder.js +203 -0
  74. package/dist/core/block-settings-menu/MenuPositioner.d.ts +22 -0
  75. package/dist/core/block-settings-menu/MenuPositioner.js +79 -0
  76. package/dist/core/clipboard/Clipboard.d.ts +47 -0
  77. package/dist/core/clipboard/Clipboard.js +653 -0
  78. package/dist/core/clipboard/CrossBlockEditor.d.ts +43 -0
  79. package/dist/core/clipboard/CrossBlockEditor.js +198 -0
  80. package/dist/core/clipboard/PasteRouter.d.ts +27 -0
  81. package/dist/core/clipboard/PasteRouter.js +86 -0
  82. package/dist/core/clipboard/pasteInsert.d.ts +35 -0
  83. package/dist/core/clipboard/pasteInsert.js +215 -0
  84. package/dist/core/clipboard/pasteUtils.d.ts +25 -0
  85. package/dist/core/clipboard/pasteUtils.js +98 -0
  86. package/dist/core/config.d.ts +77 -0
  87. package/dist/core/config.js +100 -0
  88. package/dist/core/constants.d.ts +23 -0
  89. package/dist/core/constants.js +30 -0
  90. package/dist/core/crossBlockConvert.d.ts +38 -0
  91. package/dist/core/crossBlockConvert.js +253 -0
  92. package/dist/core/dom.d.ts +35 -0
  93. package/dist/core/dom.js +65 -0
  94. package/dist/core/editorEvents.d.ts +89 -0
  95. package/dist/core/editorEvents.js +60 -0
  96. package/dist/core/hydrateInlinePlugins.d.ts +9 -0
  97. package/dist/core/hydrateInlinePlugins.js +36 -0
  98. package/dist/core/icons.d.ts +10 -0
  99. package/dist/core/icons.js +21 -0
  100. package/dist/core/index.d.ts +59 -0
  101. package/dist/core/index.js +703 -0
  102. package/dist/core/inline-toolbar/ActionsPanel.d.ts +61 -0
  103. package/dist/core/inline-toolbar/ActionsPanel.js +132 -0
  104. package/dist/core/inline-toolbar/InlinePositioner.d.ts +20 -0
  105. package/dist/core/inline-toolbar/InlinePositioner.js +63 -0
  106. package/dist/core/inline-toolbar/InlineToolbar.d.ts +45 -0
  107. package/dist/core/inline-toolbar/InlineToolbar.js +456 -0
  108. package/dist/core/inline-toolbar/PluginControlsSlot.d.ts +52 -0
  109. package/dist/core/inline-toolbar/PluginControlsSlot.js +118 -0
  110. package/dist/core/inline-toolbar/SelectionTracker.d.ts +63 -0
  111. package/dist/core/inline-toolbar/SelectionTracker.js +173 -0
  112. package/dist/core/inlinePluginInsert.d.ts +13 -0
  113. package/dist/core/inlinePluginInsert.js +56 -0
  114. package/dist/core/locale/en.d.ts +35 -0
  115. package/dist/core/locale/en.js +37 -0
  116. package/dist/core/locale/ru.d.ts +35 -0
  117. package/dist/core/locale/ru.js +37 -0
  118. package/dist/core/menuKeyboardNav.d.ts +15 -0
  119. package/dist/core/menuKeyboardNav.js +52 -0
  120. package/dist/core/sanitize.d.ts +2 -0
  121. package/dist/core/sanitize.js +6 -0
  122. package/dist/core/splitConvert.d.ts +46 -0
  123. package/dist/core/splitConvert.js +190 -0
  124. package/dist/core/textOffset.d.ts +46 -0
  125. package/dist/core/textOffset.js +180 -0
  126. package/dist/core/themes/dark.css +30 -0
  127. package/dist/core/themes/light.css +33 -0
  128. package/dist/core/themes/variables.css +1170 -0
  129. package/dist/core/toolbar/OffcanvasRoot.d.ts +37 -0
  130. package/dist/core/toolbar/OffcanvasRoot.js +127 -0
  131. package/dist/core/toolbar/Toolbar.d.ts +70 -0
  132. package/dist/core/toolbar/Toolbar.js +432 -0
  133. package/dist/core/toolbar/ToolbarPositioner.d.ts +60 -0
  134. package/dist/core/toolbar/ToolbarPositioner.js +188 -0
  135. package/dist/core/toolbar/ToolboxBuilder.d.ts +44 -0
  136. package/dist/core/toolbar/ToolboxBuilder.js +260 -0
  137. package/dist/core/types.d.ts +747 -0
  138. package/dist/core/uid.d.ts +6 -0
  139. package/dist/core/uid.js +29 -0
  140. package/dist/index.d.ts +2 -0
  141. package/dist/index.js +1 -0
  142. package/dist/inline-plugins/README.md +35 -0
  143. package/dist/inline-plugins/README.ru.md +35 -0
  144. package/dist/inline-plugins/color/README.md +61 -0
  145. package/dist/inline-plugins/color/README.ru.md +61 -0
  146. package/dist/inline-plugins/color.d.ts +8 -0
  147. package/dist/inline-plugins/color.js +184 -0
  148. package/dist/inline-plugins/locale/en.d.ts +7 -0
  149. package/dist/inline-plugins/locale/en.js +6 -0
  150. package/dist/inline-plugins/locale/ru.d.ts +7 -0
  151. package/dist/inline-plugins/locale/ru.js +6 -0
  152. package/dist/inline-plugins/mention/README.md +97 -0
  153. package/dist/inline-plugins/mention/README.ru.md +97 -0
  154. package/dist/inline-plugins/mention/index.d.ts +110 -0
  155. package/dist/inline-plugins/mention/index.js +1897 -0
  156. package/dist/inline-plugins/mention/styles.css +183 -0
  157. package/dist/inline-plugins/mention/widget.d.ts +16 -0
  158. package/dist/inline-plugins/mention/widget.js +75 -0
  159. package/dist/inline-tools/align.d.ts +14 -0
  160. package/dist/inline-tools/align.js +120 -0
  161. package/dist/inline-tools/bold.d.ts +8 -0
  162. package/dist/inline-tools/bold.js +12 -0
  163. package/dist/inline-tools/caseTransform.d.ts +8 -0
  164. package/dist/inline-tools/caseTransform.js +87 -0
  165. package/dist/inline-tools/clearFormatting.d.ts +8 -0
  166. package/dist/inline-tools/clearFormatting.js +74 -0
  167. package/dist/inline-tools/code.d.ts +8 -0
  168. package/dist/inline-tools/code.js +12 -0
  169. package/dist/inline-tools/colorPicker.d.ts +7 -0
  170. package/dist/inline-tools/colorPicker.js +271 -0
  171. package/dist/inline-tools/defaults.d.ts +10 -0
  172. package/dist/inline-tools/defaults.js +57 -0
  173. package/dist/inline-tools/fontSize.d.ts +7 -0
  174. package/dist/inline-tools/fontSize.js +524 -0
  175. package/dist/inline-tools/italic.d.ts +8 -0
  176. package/dist/inline-tools/italic.js +12 -0
  177. package/dist/inline-tools/link.d.ts +12 -0
  178. package/dist/inline-tools/link.js +251 -0
  179. package/dist/inline-tools/marker.d.ts +8 -0
  180. package/dist/inline-tools/marker.js +12 -0
  181. package/dist/inline-tools/scriptTool.d.ts +11 -0
  182. package/dist/inline-tools/scriptTool.js +149 -0
  183. package/dist/inline-tools/strikethrough.d.ts +8 -0
  184. package/dist/inline-tools/strikethrough.js +12 -0
  185. package/dist/inline-tools/utils.d.ts +220 -0
  186. package/dist/inline-tools/utils.js +992 -0
  187. package/dist/locale/en.d.ts +311 -0
  188. package/dist/locale/en.js +52 -0
  189. package/dist/locale/ru.d.ts +315 -0
  190. package/dist/locale/ru.js +52 -0
  191. package/dist/plugins/BlockPluginAbstract.d.ts +82 -0
  192. package/dist/plugins/BlockPluginAbstract.js +111 -0
  193. package/dist/plugins/README.md +44 -0
  194. package/dist/plugins/README.ru.md +40 -0
  195. package/dist/plugins/async.d.ts +35 -0
  196. package/dist/plugins/async.js +79 -0
  197. package/dist/plugins/attaches/README.md +86 -0
  198. package/dist/plugins/attaches/README.ru.md +87 -0
  199. package/dist/plugins/attaches/attaches.css +374 -0
  200. package/dist/plugins/attaches/index.d.ts +133 -0
  201. package/dist/plugins/attaches/index.js +921 -0
  202. package/dist/plugins/attaches/locale/en.d.ts +23 -0
  203. package/dist/plugins/attaches/locale/en.js +19 -0
  204. package/dist/plugins/attaches/locale/keys.d.ts +5 -0
  205. package/dist/plugins/attaches/locale/ru.d.ts +25 -0
  206. package/dist/plugins/attaches/locale/ru.js +19 -0
  207. package/dist/plugins/carousel/README.md +108 -0
  208. package/dist/plugins/carousel/README.ru.md +109 -0
  209. package/dist/plugins/carousel/carousel.css +198 -0
  210. package/dist/plugins/carousel/icons.d.ts +12 -0
  211. package/dist/plugins/carousel/icons.js +13 -0
  212. package/dist/plugins/carousel/index.d.ts +137 -0
  213. package/dist/plugins/carousel/index.js +859 -0
  214. package/dist/plugins/carousel/locale/en.d.ts +41 -0
  215. package/dist/plugins/carousel/locale/en.js +40 -0
  216. package/dist/plugins/carousel/locale/keys.d.ts +2 -0
  217. package/dist/plugins/carousel/locale/ru.d.ts +41 -0
  218. package/dist/plugins/carousel/locale/ru.js +40 -0
  219. package/dist/plugins/carousel/state.d.ts +29 -0
  220. package/dist/plugins/carousel/state.js +42 -0
  221. package/dist/plugins/checklist/README.md +54 -0
  222. package/dist/plugins/checklist/README.ru.md +55 -0
  223. package/dist/plugins/checklist/checklist.css +80 -0
  224. package/dist/plugins/checklist/index.d.ts +75 -0
  225. package/dist/plugins/checklist/index.js +407 -0
  226. package/dist/plugins/checklist/locale/en.d.ts +5 -0
  227. package/dist/plugins/checklist/locale/en.js +4 -0
  228. package/dist/plugins/checklist/locale/keys.d.ts +5 -0
  229. package/dist/plugins/checklist/locale/ru.d.ts +5 -0
  230. package/dist/plugins/checklist/locale/ru.js +4 -0
  231. package/dist/plugins/checklist/mapTextFields.d.ts +1 -0
  232. package/dist/plugins/checklist/mapTextFields.js +1 -0
  233. package/dist/plugins/code/README.md +59 -0
  234. package/dist/plugins/code/README.ru.md +60 -0
  235. package/dist/plugins/code/code.css +360 -0
  236. package/dist/plugins/code/index.d.ts +109 -0
  237. package/dist/plugins/code/index.js +1012 -0
  238. package/dist/plugins/code/locale/en.d.ts +11 -0
  239. package/dist/plugins/code/locale/en.js +10 -0
  240. package/dist/plugins/code/locale/keys.d.ts +5 -0
  241. package/dist/plugins/code/locale/ru.d.ts +11 -0
  242. package/dist/plugins/code/locale/ru.js +10 -0
  243. package/dist/plugins/columns/README.md +55 -0
  244. package/dist/plugins/columns/README.ru.md +56 -0
  245. package/dist/plugins/columns/columns.css +103 -0
  246. package/dist/plugins/columns/index.d.ts +58 -0
  247. package/dist/plugins/columns/index.js +236 -0
  248. package/dist/plugins/columns/locale/en.d.ts +6 -0
  249. package/dist/plugins/columns/locale/en.js +5 -0
  250. package/dist/plugins/columns/locale/keys.d.ts +5 -0
  251. package/dist/plugins/columns/locale/ru.d.ts +6 -0
  252. package/dist/plugins/columns/locale/ru.js +5 -0
  253. package/dist/plugins/delimiter/README.md +48 -0
  254. package/dist/plugins/delimiter/README.ru.md +49 -0
  255. package/dist/plugins/delimiter/delimiter.css +22 -0
  256. package/dist/plugins/delimiter/index.d.ts +38 -0
  257. package/dist/plugins/delimiter/index.js +69 -0
  258. package/dist/plugins/delimiter/locale/en.d.ts +4 -0
  259. package/dist/plugins/delimiter/locale/en.js +3 -0
  260. package/dist/plugins/delimiter/locale/keys.d.ts +5 -0
  261. package/dist/plugins/delimiter/locale/ru.d.ts +4 -0
  262. package/dist/plugins/delimiter/locale/ru.js +3 -0
  263. package/dist/plugins/embed/README.md +81 -0
  264. package/dist/plugins/embed/README.ru.md +82 -0
  265. package/dist/plugins/embed/embed.css +558 -0
  266. package/dist/plugins/embed/index.d.ts +271 -0
  267. package/dist/plugins/embed/index.js +967 -0
  268. package/dist/plugins/embed/locale/en.d.ts +20 -0
  269. package/dist/plugins/embed/locale/en.js +19 -0
  270. package/dist/plugins/embed/locale/keys.d.ts +5 -0
  271. package/dist/plugins/embed/locale/ru.d.ts +20 -0
  272. package/dist/plugins/embed/locale/ru.js +19 -0
  273. package/dist/plugins/embed/player.d.ts +1 -0
  274. package/dist/plugins/embed/player.js +1 -0
  275. package/dist/plugins/gallery/README.md +92 -0
  276. package/dist/plugins/gallery/README.ru.md +93 -0
  277. package/dist/plugins/gallery/css.d.ts +52 -0
  278. package/dist/plugins/gallery/css.js +67 -0
  279. package/dist/plugins/gallery/gallery.css +860 -0
  280. package/dist/plugins/gallery/icons.d.ts +13 -0
  281. package/dist/plugins/gallery/icons.js +45 -0
  282. package/dist/plugins/gallery/index.d.ts +126 -0
  283. package/dist/plugins/gallery/index.js +355 -0
  284. package/dist/plugins/gallery/layout.d.ts +35 -0
  285. package/dist/plugins/gallery/layout.js +79 -0
  286. package/dist/plugins/gallery/locale/en.d.ts +36 -0
  287. package/dist/plugins/gallery/locale/en.js +35 -0
  288. package/dist/plugins/gallery/locale/keys.d.ts +5 -0
  289. package/dist/plugins/gallery/locale/ru.d.ts +36 -0
  290. package/dist/plugins/gallery/locale/ru.js +35 -0
  291. package/dist/plugins/gallery/settings.d.ts +25 -0
  292. package/dist/plugins/gallery/settings.js +199 -0
  293. package/dist/plugins/gallery/slot.d.ts +73 -0
  294. package/dist/plugins/gallery/slot.js +260 -0
  295. package/dist/plugins/gallery/state.d.ts +67 -0
  296. package/dist/plugins/gallery/state.js +133 -0
  297. package/dist/plugins/gallery/styles.d.ts +10 -0
  298. package/dist/plugins/gallery/styles.js +24 -0
  299. package/dist/plugins/gallery/uploader.d.ts +31 -0
  300. package/dist/plugins/gallery/uploader.js +111 -0
  301. package/dist/plugins/gallery/view-empty.d.ts +41 -0
  302. package/dist/plugins/gallery/view-empty.js +56 -0
  303. package/dist/plugins/gallery/view-filled.d.ts +55 -0
  304. package/dist/plugins/gallery/view-filled.js +353 -0
  305. package/dist/plugins/heading/HeadingLevelSelect.d.ts +16 -0
  306. package/dist/plugins/heading/HeadingLevelSelect.js +183 -0
  307. package/dist/plugins/heading/README.md +58 -0
  308. package/dist/plugins/heading/README.ru.md +59 -0
  309. package/dist/plugins/heading/heading.css +76 -0
  310. package/dist/plugins/heading/index.d.ts +124 -0
  311. package/dist/plugins/heading/index.js +273 -0
  312. package/dist/plugins/heading/locale/en.d.ts +11 -0
  313. package/dist/plugins/heading/locale/en.js +10 -0
  314. package/dist/plugins/heading/locale/keys.d.ts +5 -0
  315. package/dist/plugins/heading/locale/ru.d.ts +11 -0
  316. package/dist/plugins/heading/locale/ru.js +10 -0
  317. package/dist/plugins/heading/mapTextFields.d.ts +1 -0
  318. package/dist/plugins/heading/mapTextFields.js +1 -0
  319. package/dist/plugins/image/README.md +93 -0
  320. package/dist/plugins/image/README.ru.md +94 -0
  321. package/dist/plugins/image/css.d.ts +47 -0
  322. package/dist/plugins/image/css.js +47 -0
  323. package/dist/plugins/image/icons.d.ts +13 -0
  324. package/dist/plugins/image/icons.js +26 -0
  325. package/dist/plugins/image/image.css +559 -0
  326. package/dist/plugins/image/index.d.ts +129 -0
  327. package/dist/plugins/image/index.js +346 -0
  328. package/dist/plugins/image/locale/en.d.ts +39 -0
  329. package/dist/plugins/image/locale/en.js +38 -0
  330. package/dist/plugins/image/locale/keys.d.ts +5 -0
  331. package/dist/plugins/image/locale/ru.d.ts +39 -0
  332. package/dist/plugins/image/locale/ru.js +38 -0
  333. package/dist/plugins/image/settings.d.ts +23 -0
  334. package/dist/plugins/image/settings.js +347 -0
  335. package/dist/plugins/image/state.d.ts +86 -0
  336. package/dist/plugins/image/state.js +151 -0
  337. package/dist/plugins/image/styles.d.ts +21 -0
  338. package/dist/plugins/image/styles.js +58 -0
  339. package/dist/plugins/image/uploader.d.ts +31 -0
  340. package/dist/plugins/image/uploader.js +92 -0
  341. package/dist/plugins/image/view-empty.d.ts +44 -0
  342. package/dist/plugins/image/view-empty.js +61 -0
  343. package/dist/plugins/image/view-filled.d.ts +49 -0
  344. package/dist/plugins/image/view-filled.js +282 -0
  345. package/dist/plugins/index.d.ts +21 -0
  346. package/dist/plugins/index.js +22 -0
  347. package/dist/plugins/link-preview/README.md +69 -0
  348. package/dist/plugins/link-preview/README.ru.md +70 -0
  349. package/dist/plugins/link-preview/index.d.ts +169 -0
  350. package/dist/plugins/link-preview/index.js +698 -0
  351. package/dist/plugins/link-preview/link-preview.css +254 -0
  352. package/dist/plugins/link-preview/locale/en.d.ts +14 -0
  353. package/dist/plugins/link-preview/locale/en.js +13 -0
  354. package/dist/plugins/link-preview/locale/keys.d.ts +5 -0
  355. package/dist/plugins/link-preview/locale/ru.d.ts +14 -0
  356. package/dist/plugins/link-preview/locale/ru.js +13 -0
  357. package/dist/plugins/list/README.md +59 -0
  358. package/dist/plugins/list/README.ru.md +60 -0
  359. package/dist/plugins/list/index.d.ts +134 -0
  360. package/dist/plugins/list/index.js +566 -0
  361. package/dist/plugins/list/list.css +57 -0
  362. package/dist/plugins/list/locale/en.d.ts +5 -0
  363. package/dist/plugins/list/locale/en.js +4 -0
  364. package/dist/plugins/list/locale/keys.d.ts +5 -0
  365. package/dist/plugins/list/locale/ru.d.ts +5 -0
  366. package/dist/plugins/list/locale/ru.js +4 -0
  367. package/dist/plugins/list/mapTextFields.d.ts +1 -0
  368. package/dist/plugins/list/mapTextFields.js +1 -0
  369. package/dist/plugins/paragraph/README.md +57 -0
  370. package/dist/plugins/paragraph/README.ru.md +58 -0
  371. package/dist/plugins/paragraph/index.d.ts +112 -0
  372. package/dist/plugins/paragraph/index.js +158 -0
  373. package/dist/plugins/paragraph/locale/en.d.ts +5 -0
  374. package/dist/plugins/paragraph/locale/en.js +4 -0
  375. package/dist/plugins/paragraph/locale/keys.d.ts +5 -0
  376. package/dist/plugins/paragraph/locale/ru.d.ts +5 -0
  377. package/dist/plugins/paragraph/locale/ru.js +4 -0
  378. package/dist/plugins/paragraph/mapTextFields.d.ts +1 -0
  379. package/dist/plugins/paragraph/mapTextFields.js +1 -0
  380. package/dist/plugins/paragraph/paragraph.css +56 -0
  381. package/dist/plugins/person/README.md +72 -0
  382. package/dist/plugins/person/README.ru.md +73 -0
  383. package/dist/plugins/person/index.d.ts +189 -0
  384. package/dist/plugins/person/index.js +777 -0
  385. package/dist/plugins/person/locale/en.d.ts +18 -0
  386. package/dist/plugins/person/locale/en.js +17 -0
  387. package/dist/plugins/person/locale/keys.d.ts +5 -0
  388. package/dist/plugins/person/locale/ru.d.ts +18 -0
  389. package/dist/plugins/person/locale/ru.js +17 -0
  390. package/dist/plugins/person/person.css +431 -0
  391. package/dist/plugins/person/socialResolver.d.ts +18 -0
  392. package/dist/plugins/person/socialResolver.js +69 -0
  393. package/dist/plugins/poll/README.md +96 -0
  394. package/dist/plugins/poll/README.ru.md +97 -0
  395. package/dist/plugins/poll/index.d.ts +134 -0
  396. package/dist/plugins/poll/index.js +825 -0
  397. package/dist/plugins/poll/locale/en.d.ts +23 -0
  398. package/dist/plugins/poll/locale/en.js +22 -0
  399. package/dist/plugins/poll/locale/keys.d.ts +5 -0
  400. package/dist/plugins/poll/locale/ru.d.ts +23 -0
  401. package/dist/plugins/poll/locale/ru.js +22 -0
  402. package/dist/plugins/poll/poll.css +400 -0
  403. package/dist/plugins/quote/README.md +55 -0
  404. package/dist/plugins/quote/README.ru.md +56 -0
  405. package/dist/plugins/quote/index.d.ts +81 -0
  406. package/dist/plugins/quote/index.js +165 -0
  407. package/dist/plugins/quote/locale/en.d.ts +6 -0
  408. package/dist/plugins/quote/locale/en.js +5 -0
  409. package/dist/plugins/quote/locale/keys.d.ts +5 -0
  410. package/dist/plugins/quote/locale/ru.d.ts +6 -0
  411. package/dist/plugins/quote/locale/ru.js +5 -0
  412. package/dist/plugins/quote/mapTextFields.d.ts +1 -0
  413. package/dist/plugins/quote/mapTextFields.js +1 -0
  414. package/dist/plugins/quote/quote.css +72 -0
  415. package/dist/plugins/raw/README.md +54 -0
  416. package/dist/plugins/raw/README.ru.md +55 -0
  417. package/dist/plugins/raw/index.d.ts +62 -0
  418. package/dist/plugins/raw/index.js +227 -0
  419. package/dist/plugins/raw/locale/en.d.ts +7 -0
  420. package/dist/plugins/raw/locale/en.js +6 -0
  421. package/dist/plugins/raw/locale/keys.d.ts +5 -0
  422. package/dist/plugins/raw/locale/ru.d.ts +7 -0
  423. package/dist/plugins/raw/locale/ru.js +6 -0
  424. package/dist/plugins/raw/raw.css +127 -0
  425. package/dist/plugins/shared/actionBar.d.ts +19 -0
  426. package/dist/plugins/shared/actionBar.js +35 -0
  427. package/dist/plugins/shared/dropzone.d.ts +106 -0
  428. package/dist/plugins/shared/dropzone.js +107 -0
  429. package/dist/plugins/shared/fileInput.d.ts +44 -0
  430. package/dist/plugins/shared/fileInput.js +62 -0
  431. package/dist/plugins/spoiler/README.md +55 -0
  432. package/dist/plugins/spoiler/README.ru.md +56 -0
  433. package/dist/plugins/spoiler/index.d.ts +61 -0
  434. package/dist/plugins/spoiler/index.js +169 -0
  435. package/dist/plugins/spoiler/locale/en.d.ts +7 -0
  436. package/dist/plugins/spoiler/locale/en.js +6 -0
  437. package/dist/plugins/spoiler/locale/keys.d.ts +5 -0
  438. package/dist/plugins/spoiler/locale/ru.d.ts +7 -0
  439. package/dist/plugins/spoiler/locale/ru.js +6 -0
  440. package/dist/plugins/spoiler/spoiler.css +101 -0
  441. package/dist/plugins/table/README.md +55 -0
  442. package/dist/plugins/table/README.ru.md +56 -0
  443. package/dist/plugins/table/index.d.ts +85 -0
  444. package/dist/plugins/table/index.js +399 -0
  445. package/dist/plugins/table/locale/en.d.ts +9 -0
  446. package/dist/plugins/table/locale/en.js +8 -0
  447. package/dist/plugins/table/locale/keys.d.ts +5 -0
  448. package/dist/plugins/table/locale/ru.d.ts +9 -0
  449. package/dist/plugins/table/locale/ru.js +8 -0
  450. package/dist/plugins/table/table.css +58 -0
  451. package/dist/plugins/toggle/README.md +56 -0
  452. package/dist/plugins/toggle/README.ru.md +57 -0
  453. package/dist/plugins/toggle/index.d.ts +69 -0
  454. package/dist/plugins/toggle/index.js +191 -0
  455. package/dist/plugins/toggle/locale/en.d.ts +7 -0
  456. package/dist/plugins/toggle/locale/en.js +6 -0
  457. package/dist/plugins/toggle/locale/keys.d.ts +5 -0
  458. package/dist/plugins/toggle/locale/ru.d.ts +7 -0
  459. package/dist/plugins/toggle/locale/ru.js +6 -0
  460. package/dist/plugins/toggle/toggle.css +101 -0
  461. package/dist/plugins/warning/README.md +55 -0
  462. package/dist/plugins/warning/README.ru.md +56 -0
  463. package/dist/plugins/warning/index.d.ts +66 -0
  464. package/dist/plugins/warning/index.js +167 -0
  465. package/dist/plugins/warning/locale/en.d.ts +6 -0
  466. package/dist/plugins/warning/locale/en.js +5 -0
  467. package/dist/plugins/warning/locale/keys.d.ts +5 -0
  468. package/dist/plugins/warning/locale/ru.d.ts +6 -0
  469. package/dist/plugins/warning/locale/ru.js +5 -0
  470. package/dist/plugins/warning/warning.css +63 -0
  471. package/dist/renderer/async.d.ts +1 -0
  472. package/dist/renderer/async.js +7 -0
  473. package/dist/renderer/errors.d.ts +27 -0
  474. package/dist/renderer/errors.js +48 -0
  475. package/dist/renderer/index.d.ts +82 -0
  476. package/dist/renderer/index.js +413 -0
  477. package/dist/renderer/inline.d.ts +5 -0
  478. package/dist/renderer/inline.js +61 -0
  479. package/dist/renderer/locale/en.d.ts +35 -0
  480. package/dist/renderer/locale/en.js +29 -0
  481. package/dist/renderer/locale/ru.d.ts +37 -0
  482. package/dist/renderer/locale/ru.js +29 -0
  483. package/dist/renderer/renderers/README.md +7 -0
  484. package/dist/renderer/renderers/README.ru.md +5 -0
  485. package/dist/renderer/renderers/async.d.ts +51 -0
  486. package/dist/renderer/renderers/async.js +99 -0
  487. package/dist/renderer/renderers/attaches/README.md +48 -0
  488. package/dist/renderer/renderers/attaches/README.ru.md +48 -0
  489. package/dist/renderer/renderers/attaches/index.d.ts +37 -0
  490. package/dist/renderer/renderers/attaches/index.js +451 -0
  491. package/dist/renderer/renderers/attaches/locale/en.d.ts +11 -0
  492. package/dist/renderer/renderers/attaches/locale/en.js +7 -0
  493. package/dist/renderer/renderers/attaches/locale/ru.d.ts +13 -0
  494. package/dist/renderer/renderers/attaches/locale/ru.js +7 -0
  495. package/dist/renderer/renderers/attaches/styles.css +196 -0
  496. package/dist/renderer/renderers/carousel/README.md +43 -0
  497. package/dist/renderer/renderers/carousel/README.ru.md +43 -0
  498. package/dist/renderer/renderers/carousel/index.d.ts +7 -0
  499. package/dist/renderer/renderers/carousel/index.js +110 -0
  500. package/dist/renderer/renderers/carousel/styles.css +7 -0
  501. package/dist/renderer/renderers/checklist/README.md +33 -0
  502. package/dist/renderer/renderers/checklist/README.ru.md +33 -0
  503. package/dist/renderer/renderers/checklist/index.d.ts +7 -0
  504. package/dist/renderer/renderers/checklist/index.js +55 -0
  505. package/dist/renderer/renderers/checklist/styles.css +54 -0
  506. package/dist/renderer/renderers/code/README.md +33 -0
  507. package/dist/renderer/renderers/code/README.ru.md +33 -0
  508. package/dist/renderer/renderers/code/index.d.ts +9 -0
  509. package/dist/renderer/renderers/code/index.js +137 -0
  510. package/dist/renderer/renderers/code/locale/en.d.ts +5 -0
  511. package/dist/renderer/renderers/code/locale/en.js +4 -0
  512. package/dist/renderer/renderers/code/locale/ru.d.ts +5 -0
  513. package/dist/renderer/renderers/code/locale/ru.js +4 -0
  514. package/dist/renderer/renderers/code/styles.css +330 -0
  515. package/dist/renderer/renderers/columns/README.md +33 -0
  516. package/dist/renderer/renderers/columns/README.ru.md +33 -0
  517. package/dist/renderer/renderers/columns/index.d.ts +7 -0
  518. package/dist/renderer/renderers/columns/index.js +53 -0
  519. package/dist/renderer/renderers/columns/styles.css +5 -0
  520. package/dist/renderer/renderers/delimiter/README.md +33 -0
  521. package/dist/renderer/renderers/delimiter/README.ru.md +33 -0
  522. package/dist/renderer/renderers/delimiter/index.d.ts +7 -0
  523. package/dist/renderer/renderers/delimiter/index.js +28 -0
  524. package/dist/renderer/renderers/delimiter/styles.css +12 -0
  525. package/dist/renderer/renderers/embed/README.md +35 -0
  526. package/dist/renderer/renderers/embed/README.ru.md +35 -0
  527. package/dist/renderer/renderers/embed/index.d.ts +8 -0
  528. package/dist/renderer/renderers/embed/index.js +66 -0
  529. package/dist/renderer/renderers/embed/styles.css +217 -0
  530. package/dist/renderer/renderers/gallery/README.md +41 -0
  531. package/dist/renderer/renderers/gallery/README.ru.md +41 -0
  532. package/dist/renderer/renderers/gallery/index.d.ts +8 -0
  533. package/dist/renderer/renderers/gallery/index.js +329 -0
  534. package/dist/renderer/renderers/gallery/styles.css +419 -0
  535. package/dist/renderer/renderers/heading/README.md +33 -0
  536. package/dist/renderer/renderers/heading/README.ru.md +33 -0
  537. package/dist/renderer/renderers/heading/index.d.ts +8 -0
  538. package/dist/renderer/renderers/heading/index.js +38 -0
  539. package/dist/renderer/renderers/heading/styles.css +26 -0
  540. package/dist/renderer/renderers/image/README.md +42 -0
  541. package/dist/renderer/renderers/image/README.ru.md +42 -0
  542. package/dist/renderer/renderers/image/index.d.ts +7 -0
  543. package/dist/renderer/renderers/image/index.js +93 -0
  544. package/dist/renderer/renderers/image/styles.css +40 -0
  545. package/dist/renderer/renderers/index.d.ts +47 -0
  546. package/dist/renderer/renderers/index.js +125 -0
  547. package/dist/renderer/renderers/link-preview/README.md +43 -0
  548. package/dist/renderer/renderers/link-preview/README.ru.md +43 -0
  549. package/dist/renderer/renderers/link-preview/index.d.ts +9 -0
  550. package/dist/renderer/renderers/link-preview/index.js +118 -0
  551. package/dist/renderer/renderers/link-preview/styles.css +246 -0
  552. package/dist/renderer/renderers/list/README.md +33 -0
  553. package/dist/renderer/renderers/list/README.ru.md +33 -0
  554. package/dist/renderer/renderers/list/index.d.ts +8 -0
  555. package/dist/renderer/renderers/list/index.js +42 -0
  556. package/dist/renderer/renderers/list/styles.css +20 -0
  557. package/dist/renderer/renderers/paragraph/README.md +33 -0
  558. package/dist/renderer/renderers/paragraph/README.ru.md +33 -0
  559. package/dist/renderer/renderers/paragraph/index.d.ts +7 -0
  560. package/dist/renderer/renderers/paragraph/index.js +35 -0
  561. package/dist/renderer/renderers/paragraph/styles.css +3 -0
  562. package/dist/renderer/renderers/person/README.md +44 -0
  563. package/dist/renderer/renderers/person/README.ru.md +44 -0
  564. package/dist/renderer/renderers/person/index.d.ts +7 -0
  565. package/dist/renderer/renderers/person/index.js +213 -0
  566. package/dist/renderer/renderers/person/locale/en.d.ts +6 -0
  567. package/dist/renderer/renderers/person/locale/en.js +5 -0
  568. package/dist/renderer/renderers/person/locale/ru.d.ts +6 -0
  569. package/dist/renderer/renderers/person/locale/ru.js +5 -0
  570. package/dist/renderer/renderers/person/styles.css +47 -0
  571. package/dist/renderer/renderers/poll/README.md +68 -0
  572. package/dist/renderer/renderers/poll/README.ru.md +68 -0
  573. package/dist/renderer/renderers/poll/index.d.ts +9 -0
  574. package/dist/renderer/renderers/poll/index.js +339 -0
  575. package/dist/renderer/renderers/poll/styles.css +148 -0
  576. package/dist/renderer/renderers/quote/README.md +33 -0
  577. package/dist/renderer/renderers/quote/README.ru.md +33 -0
  578. package/dist/renderer/renderers/quote/index.d.ts +7 -0
  579. package/dist/renderer/renderers/quote/index.js +59 -0
  580. package/dist/renderer/renderers/quote/styles.css +43 -0
  581. package/dist/renderer/renderers/raw/README.md +33 -0
  582. package/dist/renderer/renderers/raw/README.ru.md +33 -0
  583. package/dist/renderer/renderers/raw/index.d.ts +7 -0
  584. package/dist/renderer/renderers/raw/index.js +27 -0
  585. package/dist/renderer/renderers/spoiler/README.md +33 -0
  586. package/dist/renderer/renderers/spoiler/README.ru.md +33 -0
  587. package/dist/renderer/renderers/spoiler/index.d.ts +9 -0
  588. package/dist/renderer/renderers/spoiler/index.js +84 -0
  589. package/dist/renderer/renderers/spoiler/locale/en.d.ts +4 -0
  590. package/dist/renderer/renderers/spoiler/locale/en.js +3 -0
  591. package/dist/renderer/renderers/spoiler/locale/ru.d.ts +4 -0
  592. package/dist/renderer/renderers/spoiler/locale/ru.js +3 -0
  593. package/dist/renderer/renderers/spoiler/styles.css +61 -0
  594. package/dist/renderer/renderers/table/README.md +33 -0
  595. package/dist/renderer/renderers/table/README.ru.md +33 -0
  596. package/dist/renderer/renderers/table/index.d.ts +7 -0
  597. package/dist/renderer/renderers/table/index.js +83 -0
  598. package/dist/renderer/renderers/table/styles.css +34 -0
  599. package/dist/renderer/renderers/toggle/README.md +33 -0
  600. package/dist/renderer/renderers/toggle/README.ru.md +33 -0
  601. package/dist/renderer/renderers/toggle/index.d.ts +7 -0
  602. package/dist/renderer/renderers/toggle/index.js +59 -0
  603. package/dist/renderer/renderers/toggle/styles.css +49 -0
  604. package/dist/renderer/renderers/warning/README.md +33 -0
  605. package/dist/renderer/renderers/warning/README.ru.md +33 -0
  606. package/dist/renderer/renderers/warning/index.d.ts +7 -0
  607. package/dist/renderer/renderers/warning/index.js +62 -0
  608. package/dist/renderer/renderers/warning/styles.css +41 -0
  609. package/dist/renderer/styles/base.css +168 -0
  610. package/dist/renderer/types.d.ts +464 -0
  611. package/dist/shared/blockDataNormalizers.d.ts +14 -0
  612. package/dist/shared/blockDataNormalizers.js +235 -0
  613. package/dist/shared/blockDataValidators.d.ts +81 -0
  614. package/dist/shared/blockDataValidators.js +313 -0
  615. package/dist/shared/blockTypes.d.ts +2 -0
  616. package/dist/shared/blockTypes.js +26 -0
  617. package/dist/shared/carouselData.d.ts +34 -0
  618. package/dist/shared/carouselData.js +111 -0
  619. package/dist/shared/cloneEditorData.d.ts +11 -0
  620. package/dist/shared/cloneEditorData.js +20 -0
  621. package/dist/shared/documentTypes.d.ts +35 -0
  622. package/dist/shared/embedPlayer.d.ts +42 -0
  623. package/dist/shared/embedPlayer.js +141 -0
  624. package/dist/shared/fileUtils.d.ts +33 -0
  625. package/dist/shared/fileUtils.js +109 -0
  626. package/dist/shared/highlightRuntime.d.ts +38 -0
  627. package/dist/shared/highlightRuntime.js +75 -0
  628. package/dist/shared/inlineMarshal.d.ts +82 -0
  629. package/dist/shared/inlineMarshal.js +215 -0
  630. package/dist/shared/jsonData.d.ts +11 -0
  631. package/dist/shared/jsonData.js +53 -0
  632. package/dist/shared/localeTypes.d.ts +11 -0
  633. package/dist/shared/mapTextFields.d.ts +89 -0
  634. package/dist/shared/mapTextFields.js +119 -0
  635. package/dist/shared/pollData.d.ts +90 -0
  636. package/dist/shared/pollData.js +231 -0
  637. package/dist/shared/resolvePath.d.ts +8 -0
  638. package/dist/shared/resolvePath.js +10 -0
  639. package/dist/shared/runtime/dompurify.js +2424 -0
  640. package/dist/shared/runtime/highlightBundle.js +10 -0
  641. package/dist/shared/runtime/jszip.js +13 -0
  642. package/dist/shared/sanitize/allowlist.d.ts +21 -0
  643. package/dist/shared/sanitize/allowlist.js +40 -0
  644. package/dist/shared/sanitize/escapeHtml.d.ts +6 -0
  645. package/dist/shared/sanitize/escapeHtml.js +11 -0
  646. package/dist/shared/sanitize/index.d.ts +8 -0
  647. package/dist/shared/sanitize/index.js +8 -0
  648. package/dist/shared/sanitize/parseInline.d.ts +11 -0
  649. package/dist/shared/sanitize/parseInline.js +25 -0
  650. package/dist/shared/sanitize/sanitizeHtml.d.ts +8 -0
  651. package/dist/shared/sanitize/sanitizeHtml.js +19 -0
  652. package/dist/shared/sanitize/sanitizeRawHtml.d.ts +15 -0
  653. package/dist/shared/sanitize/sanitizeRawHtml.js +162 -0
  654. package/dist/shared/sanitize/sanitizeStyle.d.ts +9 -0
  655. package/dist/shared/sanitize/sanitizeStyle.js +39 -0
  656. package/dist/shared/sanitize/sanitizeUrl.d.ts +28 -0
  657. package/dist/shared/sanitize/sanitizeUrl.js +86 -0
  658. package/dist/shared/sanitize/walker.d.ts +15 -0
  659. package/dist/shared/sanitize/walker.js +98 -0
  660. package/dist/shared/styleRegistry.d.ts +4 -0
  661. package/dist/shared/styleRegistry.js +38 -0
  662. package/dist/shared/textFormat.d.ts +32 -0
  663. package/dist/shared/textFormat.js +48 -0
  664. package/dist/shared/zipRuntime.d.ts +19 -0
  665. package/dist/shared/zipRuntime.js +54 -0
  666. package/dist/styles/editor.css +3 -0
  667. package/dist/types.d.ts +1 -0
  668. package/package.json +149 -0
@@ -0,0 +1,111 @@
1
+ import { sanitizeRawHtml } from './sanitize/sanitizeRawHtml.js'
2
+ import { sanitizeUrl } from './sanitize/sanitizeUrl.js'
3
+
4
+ /**
5
+ * @typedef {{ id: string, type: 'image' | 'video' | 'html', src?: string, alt?: string, caption?: string, poster?: string, html?: string }} CarouselSlide
6
+ * @typedef {{ loop: boolean, autoplay: boolean, autoplayDelay: number, navigation: boolean, pagination: boolean, thumbnails: boolean, aspectRatio?: string }} CarouselOptions
7
+ * @typedef {{ slides: CarouselSlide[], options: CarouselOptions }} CarouselData
8
+ */
9
+
10
+ const ASPECT_RATIO_RE = /^(\d+(?:\.\d+)?)\s*\/\s*(\d+(?:\.\d+)?)$/
11
+
12
+ /** @param {unknown} value @returns {value is Record<string, unknown>} */
13
+ function isRecord(value) {
14
+ return !!value && typeof value === 'object' && !Array.isArray(value)
15
+ }
16
+
17
+ /**
18
+ * Normalize a CSS aspect-ratio value accepted by the carousel contract.
19
+ * Both numeric components must be finite and strictly positive.
20
+ *
21
+ * @param {unknown} value
22
+ * @returns {string | undefined}
23
+ */
24
+ export function normalizeCarouselAspectRatio(value) {
25
+ if (typeof value !== 'string') return undefined
26
+ const normalized = value.trim()
27
+ if (normalized === 'auto') return normalized
28
+ const match = normalized.match(ASPECT_RATIO_RE)
29
+ if (!match) return undefined
30
+ const width = Number(match[1])
31
+ const height = Number(match[2])
32
+ return Number.isFinite(width) && width > 0 && Number.isFinite(height) && height > 0
33
+ ? normalized
34
+ : undefined
35
+ }
36
+
37
+ /** @param {unknown} input @param {() => string} createId @returns {CarouselData} */
38
+ export function normalizeCarouselData(input, createId) {
39
+ const source = isRecord(input) ? /** @type {Record<string, unknown>} */ (input) : {}
40
+ const seen = new Set()
41
+ const slides = (Array.isArray(source.slides) ? source.slides : []).flatMap(raw => {
42
+ if (!isRecord(raw)) return []
43
+ const type = raw.type === 'video' || raw.type === 'html' ? raw.type : 'image'
44
+ let id = typeof raw.id === 'string' && raw.id ? raw.id : createId()
45
+ while (seen.has(id)) id = createId()
46
+ seen.add(id)
47
+ /** @type {CarouselSlide} */
48
+ const slide = { id, type }
49
+ if (type === 'html') {
50
+ slide.html = sanitizeRawHtml(typeof raw.html === 'string' ? raw.html : '')
51
+ } else {
52
+ slide.src = sanitizeUrl(typeof raw.src === 'string' ? raw.src : '', { policy: 'media', fallback: '' })
53
+ if (type === 'video') {
54
+ slide.poster = sanitizeUrl(typeof raw.poster === 'string' ? raw.poster : '', { policy: 'media', fallback: '' })
55
+ }
56
+ if (typeof raw.alt === 'string') slide.alt = raw.alt
57
+ }
58
+ if (typeof raw.caption === 'string') slide.caption = raw.caption
59
+ return [slide]
60
+ })
61
+ const rawOptions = isRecord(source.options) ? source.options : {}
62
+ /** @type {CarouselOptions} */
63
+ const options = {
64
+ loop: rawOptions.loop === true,
65
+ autoplay: rawOptions.autoplay === true,
66
+ autoplayDelay: typeof rawOptions.autoplayDelay === 'number'
67
+ && Number.isFinite(rawOptions.autoplayDelay)
68
+ && rawOptions.autoplayDelay > 0
69
+ ? Math.floor(rawOptions.autoplayDelay)
70
+ : 3000,
71
+ navigation: rawOptions.navigation !== false,
72
+ pagination: rawOptions.pagination !== false,
73
+ thumbnails: rawOptions.thumbnails === true,
74
+ }
75
+ const aspectRatio = normalizeCarouselAspectRatio(rawOptions.aspectRatio)
76
+ if (aspectRatio) options.aspectRatio = aspectRatio
77
+ return { slides, options }
78
+ }
79
+
80
+ /** @param {unknown} data */
81
+ export function validateCarouselData(data) {
82
+ if (!isRecord(data)) return false
83
+ const value = /** @type {Record<string, unknown>} */ (data)
84
+ if (!Array.isArray(value.slides) || value.slides.length === 0) return false
85
+ const ids = new Set()
86
+ for (const slide of value.slides) {
87
+ if (!isRecord(slide) || typeof slide.id !== 'string' || !slide.id || ids.has(slide.id)) return false
88
+ ids.add(slide.id)
89
+ if (typeof slide.type !== 'string' || !['image', 'video', 'html'].includes(slide.type)) return false
90
+ if (slide.caption !== undefined && typeof slide.caption !== 'string') return false
91
+ if (slide.type === 'html') {
92
+ if (typeof slide.html !== 'string' || !slide.html.trim()) return false
93
+ } else {
94
+ if (typeof slide.src !== 'string' || !slide.src
95
+ || sanitizeUrl(slide.src, { policy: 'media', fallback: '' }) !== slide.src) return false
96
+ if (slide.alt !== undefined && typeof slide.alt !== 'string') return false
97
+ if (slide.type === 'video' && slide.poster !== undefined
98
+ && (typeof slide.poster !== 'string'
99
+ || sanitizeUrl(slide.poster, { policy: 'media', fallback: '' }) !== slide.poster)) return false
100
+ }
101
+ }
102
+ if (!isRecord(value.options)) return false
103
+ for (const key of ['loop', 'autoplay', 'navigation', 'pagination', 'thumbnails']) {
104
+ if (typeof value.options[key] !== 'boolean') return false
105
+ }
106
+ if (typeof value.options.autoplayDelay !== 'number'
107
+ || !Number.isFinite(value.options.autoplayDelay)
108
+ || value.options.autoplayDelay <= 0) return false
109
+ return value.options.aspectRatio === undefined
110
+ || normalizeCarouselAspectRatio(value.options.aspectRatio) !== undefined
111
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Take ownership of serializable editor data at an API boundary.
3
+ * Editor block data is a JSON document model. Validation happens before the
4
+ * clone so history, storage, workers, and network transports observe the same
5
+ * value shape.
6
+ *
7
+ * @template T
8
+ * @param {T} value
9
+ * @returns {T}
10
+ */
11
+ export function cloneEditorData<T>(value: T): T;
@@ -0,0 +1,20 @@
1
+ // @ts-check
2
+ import { assertJsonValue } from './jsonData.js'
3
+
4
+ /**
5
+ * Take ownership of serializable editor data at an API boundary.
6
+ * Editor block data is a JSON document model. Validation happens before the
7
+ * clone so history, storage, workers, and network transports observe the same
8
+ * value shape.
9
+ *
10
+ * @template T
11
+ * @param {T} value
12
+ * @returns {T}
13
+ */
14
+ export function cloneEditorData(value) {
15
+ assertJsonValue(value)
16
+ if (typeof structuredClone === 'function') {
17
+ return structuredClone(value)
18
+ }
19
+ return JSON.parse(JSON.stringify(value))
20
+ }
@@ -0,0 +1,35 @@
1
+ /** Opaque data owned by one committed inline widget instance. */
2
+ export interface EditorInlineWidget<
3
+ Type extends string = string,
4
+ Data extends Record<string, unknown> = Record<string, unknown>,
5
+ > {
6
+ type: Type
7
+ data: Data
8
+ }
9
+
10
+ /** Canonical persisted block shape shared by the editor and document renderer. */
11
+ export interface EditorBlockData<
12
+ Type extends string = string,
13
+ Data extends object = Record<string, unknown>,
14
+ > {
15
+ id?: string
16
+ /**
17
+ * Optional producer-owned content revision (or stable content hash).
18
+ * When present, incremental renderers can compare blocks in O(1).
19
+ * The producer must change it whenever `data`, `tunes`, or `inline` changes.
20
+ */
21
+ revision?: string | number
22
+ type: Type
23
+ data: Data
24
+ tunes?: Record<string, unknown>
25
+ inline?: Record<string, EditorInlineWidget>
26
+ }
27
+
28
+ /** Canonical editor output envelope. Composition layers may narrow fields. */
29
+ export interface EditorOutputData<
30
+ Block extends EditorBlockData<string, object> = EditorBlockData,
31
+ > {
32
+ time?: number
33
+ version?: string
34
+ blocks: Block[]
35
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Build a video player DOM subtree.
3
+ *
4
+ * `playIcon` and `placeholderHtml` are inserted with `innerHTML` and therefore
5
+ * must contain trusted application-owned markup, never user content.
6
+ *
7
+ * @param {{
8
+ * service: string,
9
+ * videoId: string,
10
+ * cover?: string,
11
+ * title?: string,
12
+ * duration?: string,
13
+ * classPrefix: string,
14
+ * playIcon: string,
15
+ * placeholderHtml?: string,
16
+ * playLabel?: string,
17
+ * videoLabel?: string,
18
+ * }} opts
19
+ * @returns {{ player: HTMLElement, play: () => void, setPreview: (src: string, alt?: string) => void }}
20
+ */
21
+ export function buildPlayer(opts: {
22
+ service: string;
23
+ videoId: string;
24
+ cover?: string;
25
+ title?: string;
26
+ duration?: string;
27
+ classPrefix: string;
28
+ playIcon: string;
29
+ placeholderHtml?: string;
30
+ playLabel?: string;
31
+ videoLabel?: string;
32
+ }): {
33
+ player: HTMLElement;
34
+ play: () => void;
35
+ setPreview: (src: string, alt?: string) => void;
36
+ };
37
+ /** @type {Record<string, { regex: RegExp[], embedUrl: (id: string) => string, previewUrl: ((id: string) => string) | null }>} */
38
+ export const SERVICES: Record<string, {
39
+ regex: RegExp[];
40
+ embedUrl: (id: string) => string;
41
+ previewUrl: ((id: string) => string) | null;
42
+ }>;
@@ -0,0 +1,141 @@
1
+ import { sanitizeUrl, setSafeUrlAttribute } from './sanitize/sanitizeUrl.js'
2
+
3
+ /** @type {Record<string, { regex: RegExp[], embedUrl: (id: string) => string, previewUrl: ((id: string) => string) | null }>} */
4
+ export const SERVICES = {
5
+ youtube: {
6
+ regex: [/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/shorts\/)([a-zA-Z0-9_-]{11})/],
7
+ embedUrl: (id) => `https://www.youtube.com/embed/${id}?autoplay=1&rel=0`,
8
+ previewUrl: (id) => `https://img.youtube.com/vi/${id}/hqdefault.jpg`,
9
+ },
10
+ vimeo: {
11
+ regex: [/vimeo\.com\/(\d+)/],
12
+ embedUrl: (id) => `https://player.vimeo.com/video/${id}?autoplay=1`,
13
+ previewUrl: null,
14
+ },
15
+ }
16
+
17
+ const IFRAME_ALLOW = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'
18
+ const IFRAME_SANDBOX = 'allow-scripts allow-same-origin allow-presentation allow-popups'
19
+
20
+ /**
21
+ * Build a video player DOM subtree.
22
+ *
23
+ * `playIcon` and `placeholderHtml` are inserted with `innerHTML` and therefore
24
+ * must contain trusted application-owned markup, never user content.
25
+ *
26
+ * @param {{
27
+ * service: string,
28
+ * videoId: string,
29
+ * cover?: string,
30
+ * title?: string,
31
+ * duration?: string,
32
+ * classPrefix: string,
33
+ * playIcon: string,
34
+ * placeholderHtml?: string,
35
+ * playLabel?: string,
36
+ * videoLabel?: string,
37
+ * }} opts
38
+ * @returns {{ player: HTMLElement, play: () => void, setPreview: (src: string, alt?: string) => void }}
39
+ */
40
+ export function buildPlayer(opts) {
41
+ const { service, videoId, cover, title, duration, classPrefix, playIcon, placeholderHtml } = opts
42
+ const playLabel = opts.playLabel || 'Play'
43
+ const videoLabel = opts.videoLabel || 'Video'
44
+ const svc = SERVICES[service]
45
+ const prefix = `${classPrefix}-embed`
46
+
47
+ const player = document.createElement('div')
48
+ player.className = `${prefix}__player`
49
+
50
+ // Preview: custom cover → service thumbnail → placeholder
51
+ const previewUrl = sanitizeUrl(cover || '', { policy: 'media', fallback: '' })
52
+ || svc?.previewUrl?.(videoId)
53
+ || ''
54
+
55
+ /** @type {HTMLElement | null} */
56
+ let previewEl = null
57
+
58
+ if (previewUrl) {
59
+ const img = document.createElement('img')
60
+ img.className = `${prefix}__preview`
61
+ const safePreview = setSafeUrlAttribute(img, 'src', previewUrl, 'media')
62
+ img.alt = title || videoLabel
63
+ img.loading = 'lazy'
64
+ if (safePreview) {
65
+ player.appendChild(img)
66
+ previewEl = img
67
+ }
68
+ }
69
+ if (!previewEl && placeholderHtml) {
70
+ previewEl = document.createElement('div')
71
+ previewEl.className = `${prefix}__placeholder`
72
+ previewEl.innerHTML = placeholderHtml
73
+ player.appendChild(previewEl)
74
+ }
75
+
76
+ // Play button
77
+ const playBtn = document.createElement('button')
78
+ playBtn.type = 'button'
79
+ playBtn.className = `${prefix}__play-btn`
80
+ playBtn.innerHTML = playIcon
81
+ playBtn.setAttribute('aria-label', playLabel)
82
+ player.appendChild(playBtn)
83
+
84
+ // Title overlay (top-left)
85
+ if (title) {
86
+ const titleEl = document.createElement('span')
87
+ titleEl.className = `${prefix}__title`
88
+ titleEl.textContent = title
89
+ player.appendChild(titleEl)
90
+ }
91
+
92
+ // Duration overlay (bottom-right)
93
+ if (duration) {
94
+ const durEl = document.createElement('span')
95
+ durEl.className = `${prefix}__duration`
96
+ durEl.textContent = duration
97
+ player.appendChild(durEl)
98
+ }
99
+
100
+ // Iframe container (empty until play)
101
+ const iframeWrap = document.createElement('div')
102
+ iframeWrap.className = `${prefix}__iframe`
103
+ player.appendChild(iframeWrap)
104
+
105
+ /** Create and inject the iframe, toggle playing state. */
106
+ function play() {
107
+ if (iframeWrap.firstElementChild) return
108
+ const embedUrl = svc?.embedUrl(videoId)
109
+ if (!embedUrl) return
110
+
111
+ player.classList.add(`${prefix}__player--playing`)
112
+
113
+ const iframe = document.createElement('iframe')
114
+ setSafeUrlAttribute(iframe, 'src', embedUrl, 'external')
115
+ iframe.style.border = '0'
116
+ iframe.allowFullscreen = true
117
+ iframe.setAttribute('allow', IFRAME_ALLOW)
118
+ iframe.setAttribute('sandbox', IFRAME_SANDBOX)
119
+ iframe.title = title || videoLabel
120
+ iframeWrap.appendChild(iframe)
121
+ }
122
+
123
+ /**
124
+ * Replace the preview image (e.g. after async Vimeo oEmbed fetch).
125
+ * @param {string} src
126
+ * @param {string} [alt]
127
+ */
128
+ function setPreview(src, alt) {
129
+ const img = document.createElement('img')
130
+ img.className = `${prefix}__preview`
131
+ const safePreview = setSafeUrlAttribute(img, 'src', src, 'media')
132
+ if (!safePreview) return
133
+ img.alt = alt || videoLabel
134
+ img.loading = 'lazy'
135
+ if (previewEl) previewEl.remove()
136
+ player.insertBefore(img, player.firstChild)
137
+ previewEl = img
138
+ }
139
+
140
+ return { player, play, setPreview }
141
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Get the SVG icon for a file extension.
3
+ * @param {string} ext lowercase extension without dot
4
+ * @returns {{ svg: string, key: string }}
5
+ */
6
+ export function getFileIcon(ext: string): {
7
+ svg: string;
8
+ key: string;
9
+ };
10
+ /**
11
+ * Format bytes into a human-readable size string.
12
+ * @param {number} bytes
13
+ * @returns {string}
14
+ */
15
+ export function formatSize(bytes: number): string;
16
+ /**
17
+ * Extract the extension from a filename.
18
+ * @param {string} filename
19
+ * @returns {string}
20
+ */
21
+ export function getExtension(filename: string): string;
22
+ /**
23
+ * Format an ISO date string as DD.MM.YYYY.
24
+ * @param {string} [isoString]
25
+ * @returns {string}
26
+ */
27
+ export function formatDate(isoString?: string): string;
28
+ /** @type {Record<string, string>} */
29
+ export const FILE_ICONS: Record<string, string>;
30
+ /** Extension → icon key mapping. @type {Record<string, string>} */
31
+ export const EXT_MAP: Record<string, string>;
32
+ /** Extension → badge accent color (only for known doc types). @type {Record<string, string>} */
33
+ export const EXT_COLORS: Record<string, string>;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Shared file utilities for the Attaches plugin (editor) and its renderer.
3
+ * Icons, extension mapping, size formatting — single source of truth.
4
+ */
5
+
6
+ // Tabler Icons (24×24) — compact stroke-based file type icons
7
+ const _S = 'xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"'
8
+
9
+ /** @type {Record<string, string>} */
10
+ export const FILE_ICONS = {
11
+ pdf: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M5 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6"/><path d="M17 18h2"/><path d="M20 15h-3v6"/><path d="M11 15v6h1a2 2 0 0 0 2 -2v-2a2 2 0 0 0 -2 -2h-1"/></svg>`,
12
+ doc: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M5 15v6h1a2 2 0 0 0 2 -2v-2a2 2 0 0 0 -2 -2h-1"/><path d="M20 16.5a1.5 1.5 0 0 0 -3 0v3a1.5 1.5 0 0 0 3 0"/><path d="M12.5 15a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1 -3 0v-3a1.5 1.5 0 0 1 1.5 -1.5"/></svg>`,
13
+ xls: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M4 15l4 6"/><path d="M4 21l4 -6"/><path d="M17 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75"/><path d="M11 15v6h3"/></svg>`,
14
+ ppt: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M5 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6"/><path d="M11 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6"/><path d="M16.5 15h3"/><path d="M18 15v6"/></svg>`,
15
+ csv: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M7 16.5a1.5 1.5 0 0 0 -3 0v3a1.5 1.5 0 0 0 3 0"/><path d="M10 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75"/><path d="M16 15l2 6l2 -6"/></svg>`,
16
+ zip: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M16 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6"/><path d="M12 15v6"/><path d="M5 15h3l-3 6h3"/></svg>`,
17
+ sql: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M5 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75"/><path d="M18 15v6h2"/><path d="M13 15a2 2 0 0 1 2 2v2a2 2 0 1 1 -4 0v-2a2 2 0 0 1 2 -2"/><path d="M14 20l1.5 1.5"/></svg>`,
18
+ js: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M3 15h3v4.5a1.5 1.5 0 0 1 -3 0"/><path d="M9 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2h-1"/></svg>`,
19
+ ts: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2h-1"/><path d="M9 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75"/><path d="M3.5 15h3"/><path d="M5 15v6"/></svg>`,
20
+ html: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M2 21v-6"/><path d="M5 15v6"/><path d="M2 18h3"/><path d="M20 15v6h2"/><path d="M13 21v-6l2 3l2 -3v6"/><path d="M7.5 15h3"/><path d="M9 15v6"/></svg>`,
21
+ css: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M8 16.5a1.5 1.5 0 0 0 -3 0v3a1.5 1.5 0 0 0 3 0"/><path d="M11 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75"/><path d="M17 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75"/></svg>`,
22
+ xml: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/><path d="M4 15l4 6"/><path d="M4 21l4 -6"/><path d="M19 15v6h3"/><path d="M11 21v-6l2.5 3l2.5 -3v6"/></svg>`,
23
+ json: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2"/><path d="M10 13l-1 2l1 2"/><path d="M14 13l1 2l-1 2"/></svg>`,
24
+ image: `<svg ${_S}><path d="M15 8h.01"/><path d="M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12"/><path d="M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5"/><path d="M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3"/></svg>`,
25
+ audio: `<svg ${_S}><path d="M3 17a3 3 0 1 0 6 0a3 3 0 0 0 -6 0"/><path d="M13 17a3 3 0 1 0 6 0a3 3 0 0 0 -6 0"/><path d="M9 17v-13h10v13"/><path d="M9 8h10"/></svg>`,
26
+ video: `<svg ${_S}><path d="M15 10l4.553 -2.276a1 1 0 0 1 1.447 .894v6.764a1 1 0 0 1 -1.447 .894l-4.553 -2.276v-4"/><path d="M3 8a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2l0 -8"/></svg>`,
27
+ default: `<svg ${_S}><path d="M14 3v4a1 1 0 0 0 1 1h4"/><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2"/></svg>`,
28
+ }
29
+
30
+ /** Extension → icon key mapping. @type {Record<string, string>} */
31
+ export const EXT_MAP = {
32
+ pdf: 'pdf',
33
+ doc: 'doc', docx: 'doc', odt: 'doc', rtf: 'doc',
34
+ xls: 'xls', xlsx: 'xls',
35
+ ppt: 'ppt', pptx: 'ppt',
36
+ csv: 'csv', tsv: 'csv',
37
+ zip: 'zip', rar: 'zip', '7z': 'zip', tar: 'zip', gz: 'zip',
38
+ sql: 'sql', db: 'sql',
39
+ js: 'js', mjs: 'js', cjs: 'js',
40
+ ts: 'ts', tsx: 'ts',
41
+ html: 'html', htm: 'html',
42
+ css: 'css', scss: 'css', less: 'css',
43
+ xml: 'xml', svg: 'xml',
44
+ json: 'json', jsonl: 'json',
45
+ jpg: 'image', jpeg: 'image', png: 'image', gif: 'image', webp: 'image', avif: 'image', bmp: 'image', ico: 'image',
46
+ mp3: 'audio', wav: 'audio', ogg: 'audio', flac: 'audio', aac: 'audio', m4a: 'audio', wma: 'audio',
47
+ mp4: 'video', avi: 'video', mov: 'video', mkv: 'video', webm: 'video', wmv: 'video', flv: 'video',
48
+ }
49
+
50
+ /** Extension → badge accent color (only for known doc types). @type {Record<string, string>} */
51
+ export const EXT_COLORS = {
52
+ pdf: '#e74c3c',
53
+ doc: '#2b579a', docx: '#2b579a',
54
+ xls: '#217346', xlsx: '#217346',
55
+ ppt: '#d24726', pptx: '#d24726',
56
+ zip: '#f39c12', rar: '#f39c12', '7z': '#f39c12',
57
+ }
58
+
59
+ /**
60
+ * Get the SVG icon for a file extension.
61
+ * @param {string} ext lowercase extension without dot
62
+ * @returns {{ svg: string, key: string }}
63
+ */
64
+ export function getFileIcon(ext) {
65
+ const key = EXT_MAP[ext.toLowerCase()] || 'default'
66
+ return { svg: FILE_ICONS[key] ?? FILE_ICONS['default'] ?? '', key }
67
+ }
68
+
69
+ /**
70
+ * Format bytes into a human-readable size string.
71
+ * @param {number} bytes
72
+ * @returns {string}
73
+ */
74
+ export function formatSize(bytes) {
75
+ if (!bytes || bytes <= 0) return ''
76
+ if (bytes < 1024) return `${bytes}B`
77
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)}KB`
78
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`
79
+ }
80
+
81
+ /**
82
+ * Extract the extension from a filename.
83
+ * @param {string} filename
84
+ * @returns {string}
85
+ */
86
+ export function getExtension(filename) {
87
+ if (!filename) return ''
88
+ const dot = filename.lastIndexOf('.')
89
+ return dot >= 0 ? filename.substring(dot + 1).toLowerCase() : ''
90
+ }
91
+
92
+ /**
93
+ * Format an ISO date string as DD.MM.YYYY.
94
+ * @param {string} [isoString]
95
+ * @returns {string}
96
+ */
97
+ export function formatDate(isoString) {
98
+ if (!isoString) return ''
99
+ try {
100
+ const d = new Date(isoString)
101
+ if (isNaN(d.getTime())) return ''
102
+ const dd = String(d.getDate()).padStart(2, '0')
103
+ const mm = String(d.getMonth() + 1).padStart(2, '0')
104
+ const yyyy = d.getFullYear()
105
+ return `${dd}.${mm}.${yyyy}`
106
+ } catch {
107
+ return ''
108
+ }
109
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @returns {HighlightRuntime | null}
3
+ */
4
+ export function getHighlightRuntime(): HighlightRuntime | null;
5
+ /**
6
+ * Preserve dependency injection for consumers that provide their own build.
7
+ * @param {HighlightRuntime} value
8
+ */
9
+ export function setHighlightRuntime(value: HighlightRuntime): void;
10
+ /**
11
+ * Load the browser-native local bundle once.
12
+ * @returns {Promise<HighlightRuntime>}
13
+ */
14
+ export function loadHighlightRuntime(): Promise<HighlightRuntime>;
15
+ /**
16
+ * Highlight synchronously when the runtime has already loaded.
17
+ * @param {string} code
18
+ * @param {string} [language]
19
+ * @returns {{ value: string, language: string } | null}
20
+ */
21
+ export function highlightCode(code: string, language?: string): {
22
+ value: string;
23
+ language: string;
24
+ } | null;
25
+ export const HIGHLIGHT_RUNTIME_VERSION: "11.11.1";
26
+ export type HighlightRuntime = {
27
+ highlightAuto(code: string): {
28
+ value: string;
29
+ language?: string;
30
+ };
31
+ highlight(code: string, options: {
32
+ language: string;
33
+ ignoreIllegals?: boolean;
34
+ }): {
35
+ value: string;
36
+ };
37
+ getLanguage(language: string): unknown;
38
+ };
@@ -0,0 +1,75 @@
1
+ // @ts-check
2
+
3
+ /** @typedef {{ highlightAuto(code: string): { value: string, language?: string }, highlight(code: string, options: { language: string, ignoreIllegals?: boolean }): { value: string }, getLanguage(language: string): unknown }} HighlightRuntime */
4
+
5
+ /** @type {HighlightRuntime | null} */
6
+ let runtime = null
7
+ /** @type {Promise<HighlightRuntime> | null} */
8
+ let loadPromise = null
9
+
10
+ /**
11
+ * @returns {HighlightRuntime | null}
12
+ */
13
+ export function getHighlightRuntime() {
14
+ if (!runtime && typeof globalThis !== 'undefined') {
15
+ const globalRuntime = /** @type {{ hljs?: HighlightRuntime }} */ (globalThis).hljs
16
+ if (globalRuntime) runtime = globalRuntime
17
+ }
18
+ return runtime
19
+ }
20
+
21
+ /**
22
+ * Preserve dependency injection for consumers that provide their own build.
23
+ * @param {HighlightRuntime} value
24
+ */
25
+ export function setHighlightRuntime(value) {
26
+ runtime = value
27
+ }
28
+
29
+ /**
30
+ * Load the browser-native local bundle once.
31
+ * @returns {Promise<HighlightRuntime>}
32
+ */
33
+ export function loadHighlightRuntime() {
34
+ const current = getHighlightRuntime()
35
+ if (current) return Promise.resolve(current)
36
+ if (loadPromise) return loadPromise
37
+
38
+ loadPromise = import('./runtime/highlightBundle.js')
39
+ .then(module => {
40
+ const loaded = /** @type {HighlightRuntime} */ (module.default || module)
41
+ runtime = loaded
42
+ return loaded
43
+ })
44
+ .catch(error => {
45
+ loadPromise = null
46
+ throw error
47
+ })
48
+
49
+ return loadPromise
50
+ }
51
+
52
+ /**
53
+ * Highlight synchronously when the runtime has already loaded.
54
+ * @param {string} code
55
+ * @param {string} [language]
56
+ * @returns {{ value: string, language: string } | null}
57
+ */
58
+ export function highlightCode(code, language) {
59
+ const hljs = getHighlightRuntime()
60
+ if (!hljs) return null
61
+
62
+ try {
63
+ if (language && language !== 'auto' && hljs.getLanguage(language)) {
64
+ const result = hljs.highlight(code, { language, ignoreIllegals: true })
65
+ return { value: result.value, language }
66
+ }
67
+
68
+ const result = hljs.highlightAuto(code)
69
+ return { value: result.value, language: result.language || 'plaintext' }
70
+ } catch {
71
+ return null
72
+ }
73
+ }
74
+
75
+ export const HIGHLIGHT_RUNTIME_VERSION = '11.11.1'