@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,235 @@
1
+ // @ts-check
2
+ import { normalizeCarouselData } from './carouselData.js'
3
+ import {
4
+ COLUMN_LAYOUT_SIZES,
5
+ GALLERY_LAYOUTS,
6
+ LINK_PREVIEW_TEMPLATES,
7
+ } from './blockDataValidators.js'
8
+ import { normalizePollData } from './pollData.js'
9
+ import { sanitizeUrl } from './sanitize/sanitizeUrl.js'
10
+ import {
11
+ normalizeHeadingLevel,
12
+ normalizeTextAlign,
13
+ normalizeTextValue,
14
+ } from './textFormat.js'
15
+
16
+ const ATTACH_VARIANTS = new Set(['a', 'b', 'f', 'g'])
17
+ const GALLERY_BOOLEAN_OPTIONS = [
18
+ 'loop', 'zoom', 'navigation', 'captions', 'thumbnails', 'fullscreen',
19
+ ]
20
+
21
+ /** @param {unknown} value @returns {Record<string, unknown>} */
22
+ function record(value) {
23
+ return value && typeof value === 'object' && !Array.isArray(value)
24
+ ? /** @type {Record<string, unknown>} */ (value)
25
+ : {}
26
+ }
27
+
28
+ /** @param {unknown} value @param {'link' | 'external' | 'media' | 'download'} policy */
29
+ function url(value, policy) {
30
+ return sanitizeUrl(normalizeTextValue(value), { policy, fallback: '' })
31
+ }
32
+
33
+ /** @param {unknown} value */
34
+ function positiveNumber(value) {
35
+ return Number.isFinite(value) && Number(value) > 0 ? Number(value) : undefined
36
+ }
37
+
38
+ /** @param {unknown} value */
39
+ function nonNegativeNumber(value) {
40
+ return Number.isFinite(value) && Number(value) >= 0 ? Number(value) : 0
41
+ }
42
+
43
+ /** @param {unknown} value */
44
+ function stringProperties(value) {
45
+ /** @type {Record<string, string>} */
46
+ const result = {}
47
+ for (const [key, item] of Object.entries(record(value))) {
48
+ if (typeof item === 'string') result[key] = item
49
+ }
50
+ return result
51
+ }
52
+
53
+ /**
54
+ * Convert malformed built-in block data into a safe render-only value.
55
+ *
56
+ * The `preserve` validation policy reports invalid data instead of rejecting
57
+ * the document. Renderers therefore need a deterministic boundary that cannot
58
+ * throw on arrays, objects, missing fields, or unsafe URLs. This function
59
+ * never mutates the caller's document and is used only after strict validation
60
+ * of the corresponding built-in block has failed.
61
+ *
62
+ * @param {string} type
63
+ * @param {unknown} input
64
+ * @returns {Record<string, unknown>}
65
+ */
66
+ export function normalizeKnownBlockData(type, input) {
67
+ const source = record(input)
68
+ let sequence = 0
69
+ const createId = () => `preserved-${type}-${++sequence}`
70
+
71
+ switch (type) {
72
+ case 'paragraph':
73
+ return { text: normalizeTextValue(source.text), align: normalizeTextAlign(source.align) }
74
+ case 'heading':
75
+ return {
76
+ text: normalizeTextValue(source.text),
77
+ level: normalizeHeadingLevel(source.level),
78
+ align: normalizeTextAlign(source.align),
79
+ }
80
+ case 'list':
81
+ return {
82
+ style: source.style === 'ordered' ? 'ordered' : 'unordered',
83
+ items: (Array.isArray(source.items) ? source.items : []).map(normalizeTextValue),
84
+ }
85
+ case 'quote':
86
+ return { text: normalizeTextValue(source.text), caption: normalizeTextValue(source.caption) }
87
+ case 'code':
88
+ return { code: normalizeTextValue(source.code), language: normalizeTextValue(source.language) }
89
+ case 'delimiter':
90
+ return {}
91
+ case 'warning':
92
+ return { title: normalizeTextValue(source.title), message: normalizeTextValue(source.message) }
93
+ case 'raw':
94
+ return { html: normalizeTextValue(source.html) }
95
+ case 'toggle':
96
+ return {
97
+ title: normalizeTextValue(source.title),
98
+ content: normalizeTextValue(source.content),
99
+ open: source.open === true,
100
+ }
101
+ case 'spoiler':
102
+ return { label: normalizeTextValue(source.label), content: normalizeTextValue(source.content) }
103
+ case 'table': {
104
+ const rows = (Array.isArray(source.content) ? source.content : [])
105
+ .filter(Array.isArray)
106
+ .map(row => row.map(normalizeTextValue))
107
+ const width = rows.reduce((maximum, row) => Math.max(maximum, row.length), 0)
108
+ return {
109
+ withHeadings: source.withHeadings === true,
110
+ content: rows.map(row => Array.from({ length: width }, (_, index) => row[index] ?? '')),
111
+ }
112
+ }
113
+ case 'columns': {
114
+ const layout = typeof source.layout === 'string' && COLUMN_LAYOUT_SIZES[source.layout]
115
+ ? source.layout
116
+ : '1-1'
117
+ const columns = Array.isArray(source.columns) ? source.columns : []
118
+ return {
119
+ layout,
120
+ columns: Array.from({ length: COLUMN_LAYOUT_SIZES[layout] }, (_, index) => ({
121
+ content: normalizeTextValue(record(columns[index]).content),
122
+ })),
123
+ }
124
+ }
125
+ case 'checklist':
126
+ return {
127
+ items: (Array.isArray(source.items) ? source.items : []).map(item => {
128
+ const value = record(item)
129
+ return { text: normalizeTextValue(value.text), checked: value.checked === true }
130
+ }),
131
+ }
132
+ case 'gallery': {
133
+ const optionsSource = record(source.options)
134
+ /** @type {Record<string, boolean | number>} */
135
+ const options = {}
136
+ for (const key of GALLERY_BOOLEAN_OPTIONS) options[key] = optionsSource[key] === true
137
+ const autoplayInterval = positiveNumber(optionsSource.autoplayInterval)
138
+ if (autoplayInterval) options.autoplayInterval = autoplayInterval
139
+ return {
140
+ images: (Array.isArray(source.images) ? source.images : []).flatMap(item => {
141
+ const image = record(item)
142
+ const safeUrl = url(image.url, 'media')
143
+ return safeUrl ? [{ url: safeUrl, caption: normalizeTextValue(image.caption) }] : []
144
+ }),
145
+ layout: typeof source.layout === 'string' && GALLERY_LAYOUTS.includes(source.layout)
146
+ ? source.layout
147
+ : 'auto',
148
+ styles: stringProperties(source.styles),
149
+ options,
150
+ }
151
+ }
152
+ case 'embed':
153
+ return {
154
+ service: source.service === 'vimeo' ? 'vimeo' : 'youtube',
155
+ videoId: normalizeTextValue(source.videoId),
156
+ caption: normalizeTextValue(source.caption),
157
+ cover: url(source.cover, 'media'),
158
+ title: normalizeTextValue(source.title),
159
+ duration: normalizeTextValue(source.duration),
160
+ }
161
+ case 'linkPreview':
162
+ return {
163
+ url: url(source.url, 'external'),
164
+ title: normalizeTextValue(source.title),
165
+ description: normalizeTextValue(source.description),
166
+ image: url(source.image, 'media'),
167
+ favicon: url(source.favicon, 'media'),
168
+ domain: normalizeTextValue(source.domain),
169
+ template: typeof source.template === 'string' && LINK_PREVIEW_TEMPLATES.includes(source.template)
170
+ ? source.template
171
+ : 'notion',
172
+ }
173
+ case 'image': {
174
+ const file = record(source.file)
175
+ /** @type {Record<string, string | number>} */
176
+ const normalizedFile = { url: url(file.url, 'media') }
177
+ const width = positiveNumber(file.width)
178
+ const height = positiveNumber(file.height)
179
+ if (width) normalizedFile.width = width
180
+ if (height) normalizedFile.height = height
181
+ return {
182
+ file: normalizedFile,
183
+ caption: normalizeTextValue(source.caption),
184
+ withBorder: source.withBorder === true,
185
+ expanded: source.expanded === true,
186
+ withBackground: source.withBackground === true,
187
+ styles: stringProperties(source.styles),
188
+ }
189
+ }
190
+ case 'attaches': {
191
+ const candidates = Array.isArray(source.files)
192
+ ? source.files
193
+ : (Object.keys(record(source.file)).length ? [source.file] : [])
194
+ return {
195
+ files: candidates.flatMap(candidate => {
196
+ const file = record(candidate)
197
+ const safeUrl = url(file.url, 'download')
198
+ if (!safeUrl) return []
199
+ return [{
200
+ url: safeUrl,
201
+ name: normalizeTextValue(file.name),
202
+ extension: normalizeTextValue(file.extension),
203
+ size: nonNegativeNumber(file.size),
204
+ }]
205
+ }),
206
+ variant: typeof source.variant === 'string' && ATTACH_VARIANTS.has(source.variant)
207
+ ? source.variant
208
+ : 'f',
209
+ }
210
+ }
211
+ case 'person':
212
+ return {
213
+ persons: (Array.isArray(source.persons) ? source.persons : []).map(item => {
214
+ const person = record(item)
215
+ return {
216
+ avatar: url(person.avatar, 'media'),
217
+ name: normalizeTextValue(person.name),
218
+ role: normalizeTextValue(person.role),
219
+ bio: normalizeTextValue(person.bio),
220
+ links: (Array.isArray(person.links) ? person.links : []).flatMap(item => {
221
+ const link = record(item)
222
+ const safeUrl = url(link.url, 'link')
223
+ return safeUrl ? [{ type: normalizeTextValue(link.type), url: safeUrl }] : []
224
+ }),
225
+ }
226
+ }),
227
+ }
228
+ case 'carousel':
229
+ return normalizeCarouselData(source, createId)
230
+ case 'poll':
231
+ return normalizePollData(source, createId)
232
+ default:
233
+ return source
234
+ }
235
+ }
@@ -0,0 +1,81 @@
1
+ /** @param {unknown} data */
2
+ export function validateParagraphData(data: unknown): boolean;
3
+ /** @param {unknown} data */
4
+ export function validateHeadingData(data: unknown): boolean;
5
+ /** @param {unknown} data */
6
+ export function validateListData(data: unknown): boolean;
7
+ /** @param {unknown} data */
8
+ export function validateQuoteData(data: unknown): boolean;
9
+ /** @param {unknown} data */
10
+ export function validateCodeData(data: unknown): boolean;
11
+ /** @param {unknown} data */
12
+ export function validateDelimiterData(data: unknown): data is Record<string, unknown>;
13
+ /** @param {unknown} data */
14
+ export function validateWarningData(data: unknown): boolean;
15
+ /** @param {unknown} data */
16
+ export function validateRawData(data: unknown): boolean;
17
+ /** @param {unknown} data */
18
+ export function validateToggleData(data: unknown): boolean;
19
+ /** @param {unknown} data */
20
+ export function validateSpoilerData(data: unknown): boolean;
21
+ /**
22
+ * Strict URL validation deliberately requires the stored value to already be
23
+ * canonical. Preserve mode may still normalize a value at the DOM boundary.
24
+ * @param {unknown} value
25
+ * @param {'link' | 'external' | 'media' | 'download'} policy
26
+ * @param {boolean} [optional]
27
+ */
28
+ export function isCanonicalUrl(value: unknown, policy: "link" | "external" | "media" | "download", optional?: boolean): boolean;
29
+ /** @param {unknown} data */
30
+ export function validateTableData(data: unknown): boolean;
31
+ /** @param {unknown} data */
32
+ export function validateColumnsData(data: unknown): boolean;
33
+ /** @param {unknown} data */
34
+ export function validateChecklistData(data: unknown): boolean;
35
+ /** @param {unknown} data */
36
+ export function validateGalleryData(data: unknown): boolean;
37
+ /** @param {unknown} data */
38
+ export function validateEmbedData(data: unknown): boolean;
39
+ /** @param {unknown} data */
40
+ export function validateLinkPreviewData(data: unknown): boolean;
41
+ /** @param {unknown} data */
42
+ export function validateImageData(data: unknown): boolean;
43
+ /** @param {unknown} data */
44
+ export function validateAttachesData(data: unknown): boolean;
45
+ /** @param {unknown} data */
46
+ export function validatePersonData(data: unknown): boolean;
47
+ /** @param {string} type @param {unknown} data */
48
+ export function validateKnownBlockData(type: string, data: unknown): any;
49
+ export const COLUMN_LAYOUT_SIZES: Readonly<{
50
+ '1-1': 2;
51
+ '1-2': 2;
52
+ '2-1': 2;
53
+ '1-1-1': 3;
54
+ }>;
55
+ export const GALLERY_LAYOUTS: readonly string[];
56
+ export const LINK_PREVIEW_TEMPLATES: readonly string[];
57
+ export const BLOCK_DATA_VALIDATORS: Readonly<{
58
+ attaches: typeof validateAttachesData;
59
+ carousel: typeof validateCarouselData;
60
+ checklist: typeof validateChecklistData;
61
+ code: typeof validateCodeData;
62
+ columns: typeof validateColumnsData;
63
+ delimiter: typeof validateDelimiterData;
64
+ embed: typeof validateEmbedData;
65
+ gallery: typeof validateGalleryData;
66
+ heading: typeof validateHeadingData;
67
+ image: typeof validateImageData;
68
+ linkPreview: typeof validateLinkPreviewData;
69
+ list: typeof validateListData;
70
+ paragraph: typeof validateParagraphData;
71
+ person: typeof validatePersonData;
72
+ poll: typeof validatePollData;
73
+ quote: typeof validateQuoteData;
74
+ raw: typeof validateRawData;
75
+ spoiler: typeof validateSpoilerData;
76
+ table: typeof validateTableData;
77
+ toggle: typeof validateToggleData;
78
+ warning: typeof validateWarningData;
79
+ }>;
80
+ import { validateCarouselData } from './carouselData.js';
81
+ import { validatePollData } from './pollData.js';
@@ -0,0 +1,313 @@
1
+ import { sanitizeUrl } from './sanitize/sanitizeUrl.js'
2
+ import { validatePollData } from './pollData.js'
3
+ import { validateCarouselData } from './carouselData.js'
4
+ import { isTextAlign } from './textFormat.js'
5
+
6
+ export const COLUMN_LAYOUT_SIZES = Object.freeze({
7
+ '1-1': 2,
8
+ '1-2': 2,
9
+ '2-1': 2,
10
+ '1-1-1': 3,
11
+ })
12
+
13
+ export const GALLERY_LAYOUTS = Object.freeze([
14
+ 'auto', '1', '2', '3a', '3b', '3c', '4a', '4b', '4c',
15
+ '5a', '5b', '5c', '6a', '6b', '6c', 'triptych', 'masonry',
16
+ 'poly-5', 'poly-3arch', 'poly-5flat', 'poly-3steps',
17
+ ])
18
+
19
+ export const LINK_PREVIEW_TEMPLATES = Object.freeze([
20
+ 'horizontal', 'compact', 'large-top', 'minimal', 'twitter', 'notion', 'split',
21
+ ])
22
+
23
+ const ATTACH_VARIANTS = new Set(['a', 'b', 'f', 'g'])
24
+ const GALLERY_BOOLEAN_OPTIONS = [
25
+ 'loop', 'zoom', 'navigation', 'captions', 'thumbnails', 'fullscreen',
26
+ ]
27
+ const OPTIONAL_LINK_PREVIEW_STRINGS = [
28
+ 'title', 'description', 'image', 'favicon', 'domain',
29
+ ]
30
+ const OPTIONAL_EMBED_STRINGS = ['caption', 'cover', 'title', 'duration']
31
+
32
+ /** @param {unknown} value @returns {value is Record<string, unknown>} */
33
+ function isRecord(value) {
34
+ return !!value && typeof value === 'object' && !Array.isArray(value)
35
+ }
36
+
37
+ /** @param {Record<string, unknown>} data @param {string[]} keys */
38
+ function hasOptionalStrings(data, keys) {
39
+ return keys.every(key => data[key] === undefined || typeof data[key] === 'string')
40
+ }
41
+
42
+ /** @param {unknown} value */
43
+ function isNonEmptyString(value) {
44
+ return typeof value === 'string' && value.trim().length > 0
45
+ }
46
+
47
+ /** @param {unknown} value */
48
+ function isOptionalTextAlign(value) {
49
+ return value === undefined || isTextAlign(value)
50
+ }
51
+
52
+ /** @param {unknown} data */
53
+ export function validateParagraphData(data) {
54
+ return isRecord(data)
55
+ && isNonEmptyString(data.text)
56
+ && isOptionalTextAlign(data.align)
57
+ }
58
+
59
+ /** @param {unknown} data */
60
+ export function validateHeadingData(data) {
61
+ return isRecord(data)
62
+ && isNonEmptyString(data.text)
63
+ && Number.isInteger(data.level)
64
+ && Number(data.level) >= 2
65
+ && Number(data.level) <= 6
66
+ && isOptionalTextAlign(data.align)
67
+ }
68
+
69
+ /** @param {unknown} data */
70
+ export function validateListData(data) {
71
+ return isRecord(data)
72
+ && (data.style === 'ordered' || data.style === 'unordered')
73
+ && Array.isArray(data.items)
74
+ && data.items.length > 0
75
+ && data.items.every(item => typeof item === 'string')
76
+ && data.items.some(isNonEmptyString)
77
+ }
78
+
79
+ /** @param {unknown} data */
80
+ export function validateQuoteData(data) {
81
+ return isRecord(data)
82
+ && isNonEmptyString(data.text)
83
+ && typeof data.caption === 'string'
84
+ }
85
+
86
+ /** @param {unknown} data */
87
+ export function validateCodeData(data) {
88
+ return isRecord(data)
89
+ && isNonEmptyString(data.code)
90
+ && (data.language === undefined || typeof data.language === 'string')
91
+ }
92
+
93
+ /** @param {unknown} data */
94
+ export function validateDelimiterData(data) {
95
+ return isRecord(data)
96
+ }
97
+
98
+ /** @param {unknown} data */
99
+ export function validateWarningData(data) {
100
+ return isRecord(data)
101
+ && typeof data.title === 'string'
102
+ && typeof data.message === 'string'
103
+ && (isNonEmptyString(data.title) || isNonEmptyString(data.message))
104
+ }
105
+
106
+ /** @param {unknown} data */
107
+ export function validateRawData(data) {
108
+ return isRecord(data) && isNonEmptyString(data.html)
109
+ }
110
+
111
+ /** @param {unknown} data */
112
+ export function validateToggleData(data) {
113
+ return isRecord(data)
114
+ && typeof data.title === 'string'
115
+ && typeof data.content === 'string'
116
+ && (data.open === undefined || typeof data.open === 'boolean')
117
+ && (isNonEmptyString(data.title) || isNonEmptyString(data.content))
118
+ }
119
+
120
+ /** @param {unknown} data */
121
+ export function validateSpoilerData(data) {
122
+ return isRecord(data)
123
+ && typeof data.label === 'string'
124
+ && isNonEmptyString(data.content)
125
+ }
126
+
127
+ /**
128
+ * Strict URL validation deliberately requires the stored value to already be
129
+ * canonical. Preserve mode may still normalize a value at the DOM boundary.
130
+ * @param {unknown} value
131
+ * @param {'link' | 'external' | 'media' | 'download'} policy
132
+ * @param {boolean} [optional]
133
+ */
134
+ export function isCanonicalUrl(value, policy, optional = false) {
135
+ if (optional && (value === undefined || value === '')) return true
136
+ if (typeof value !== 'string' || value.length === 0) return false
137
+ return sanitizeUrl(value, { policy, fallback: '' }) === value
138
+ }
139
+
140
+ /** @param {unknown} data */
141
+ export function validateTableData(data) {
142
+ if (!isRecord(data)) return false
143
+ const value = /** @type {Record<string, unknown>} */ (data)
144
+ const rows = value.content
145
+ if (!Array.isArray(rows) || rows.length === 0) return false
146
+ if (value.withHeadings !== undefined && typeof value.withHeadings !== 'boolean') return false
147
+ const width = Array.isArray(rows[0]) ? rows[0].length : 0
148
+ return width > 0 && rows.every(row => (
149
+ Array.isArray(row)
150
+ && row.length === width
151
+ && row.every(cell => typeof cell === 'string')
152
+ ))
153
+ }
154
+
155
+ /** @param {unknown} data */
156
+ export function validateColumnsData(data) {
157
+ if (!isRecord(data)) return false
158
+ const value = /** @type {Record<string, unknown>} */ (data)
159
+ if (typeof value.layout !== 'string') return false
160
+ const size = COLUMN_LAYOUT_SIZES[value.layout]
161
+ return Number.isInteger(size)
162
+ && Array.isArray(value.columns)
163
+ && value.columns.length === size
164
+ && value.columns.every(column => isRecord(column) && typeof column.content === 'string')
165
+ }
166
+
167
+ /** @param {unknown} data */
168
+ export function validateChecklistData(data) {
169
+ if (!isRecord(data)) return false
170
+ const items = /** @type {Record<string, unknown>} */ (data).items
171
+ return Array.isArray(items) && items.length > 0 && items.every(item => (
172
+ isRecord(item)
173
+ && typeof item.text === 'string'
174
+ && typeof item.checked === 'boolean'
175
+ ))
176
+ }
177
+
178
+ /** @param {unknown} data */
179
+ export function validateGalleryData(data) {
180
+ if (!isRecord(data)) return false
181
+ const value = /** @type {Record<string, unknown>} */ (data)
182
+ if (!Array.isArray(value.images) || value.images.length === 0) return false
183
+ if (!value.images.every(image => (
184
+ isRecord(image)
185
+ && isCanonicalUrl(image.url, 'media')
186
+ && (image.caption === undefined || typeof image.caption === 'string')
187
+ ))) return false
188
+ if (typeof value.layout !== 'string' || !GALLERY_LAYOUTS.includes(value.layout)) return false
189
+ if (value.styles !== undefined) {
190
+ if (!isRecord(value.styles)) return false
191
+ if (!Object.values(value.styles).every(item => typeof item === 'string')) return false
192
+ }
193
+ if (value.options !== undefined) {
194
+ if (!isRecord(value.options)) return false
195
+ for (const key of GALLERY_BOOLEAN_OPTIONS) {
196
+ if (value.options[key] !== undefined && typeof value.options[key] !== 'boolean') return false
197
+ }
198
+ if (value.options.autoplayInterval !== undefined
199
+ && (typeof value.options.autoplayInterval !== 'number'
200
+ || !Number.isFinite(value.options.autoplayInterval)
201
+ || value.options.autoplayInterval <= 0)) return false
202
+ }
203
+ return true
204
+ }
205
+
206
+ /** @param {unknown} data */
207
+ export function validateEmbedData(data) {
208
+ if (!isRecord(data)) return false
209
+ const value = /** @type {Record<string, unknown>} */ (data)
210
+ if (!hasOptionalStrings(value, OPTIONAL_EMBED_STRINGS)) return false
211
+ if (value.cover !== undefined && !isCanonicalUrl(value.cover, 'media', true)) return false
212
+ if (value.service === 'youtube') return typeof value.videoId === 'string' && /^[A-Za-z0-9_-]{11}$/.test(value.videoId)
213
+ if (value.service === 'vimeo') return typeof value.videoId === 'string' && /^\d+$/.test(value.videoId)
214
+ return false
215
+ }
216
+
217
+ /** @param {unknown} data */
218
+ export function validateLinkPreviewData(data) {
219
+ if (!isRecord(data)) return false
220
+ const value = /** @type {Record<string, unknown>} */ (data)
221
+ if (typeof value.url !== 'string'
222
+ || sanitizeUrl(value.url, { policy: 'external', allowRelative: false, fallback: '' }) !== value.url) return false
223
+ if (!hasOptionalStrings(value, OPTIONAL_LINK_PREVIEW_STRINGS)) return false
224
+ if (!isCanonicalUrl(value.image, 'media', true) || !isCanonicalUrl(value.favicon, 'media', true)) return false
225
+ return value.template === undefined
226
+ || (typeof value.template === 'string' && LINK_PREVIEW_TEMPLATES.includes(value.template))
227
+ }
228
+
229
+ /** @param {unknown} data */
230
+ export function validateImageData(data) {
231
+ if (!isRecord(data)) return false
232
+ const value = /** @type {Record<string, unknown>} */ (data)
233
+ if (!isRecord(value.file) || !isCanonicalUrl(value.file.url, 'media')) return false
234
+ for (const key of ['width', 'height']) {
235
+ const dimension = value.file[key]
236
+ if (dimension !== undefined
237
+ && (typeof dimension !== 'number' || !Number.isFinite(dimension) || dimension <= 0)) return false
238
+ }
239
+ if (value.caption !== undefined && typeof value.caption !== 'string') return false
240
+ for (const key of ['withBorder', 'expanded', 'withBackground']) {
241
+ if (value[key] !== undefined && typeof value[key] !== 'boolean') return false
242
+ }
243
+ return value.styles === undefined
244
+ || (isRecord(value.styles) && Object.values(value.styles).every(item => typeof item === 'string'))
245
+ }
246
+
247
+ /** @param {unknown} data */
248
+ export function validateAttachesData(data) {
249
+ if (!isRecord(data)) return false
250
+ const value = /** @type {Record<string, unknown>} */ (data)
251
+ if (value.variant !== undefined && (typeof value.variant !== 'string' || !ATTACH_VARIANTS.has(value.variant))) return false
252
+ const files = Array.isArray(value.files)
253
+ ? value.files
254
+ : (isRecord(value.file) ? [value.file] : null)
255
+ return Array.isArray(files) && files.length > 0 && files.every(file => (
256
+ isRecord(file)
257
+ && isCanonicalUrl(file.url, 'download')
258
+ && typeof file.name === 'string'
259
+ && typeof file.extension === 'string'
260
+ && typeof file.size === 'number'
261
+ && Number.isFinite(file.size)
262
+ && file.size >= 0
263
+ ))
264
+ }
265
+
266
+ /** @param {unknown} data */
267
+ export function validatePersonData(data) {
268
+ if (!isRecord(data)) return false
269
+ const persons = /** @type {Record<string, unknown>} */ (data).persons
270
+ return Array.isArray(persons) && persons.length > 0 && persons.every(person => (
271
+ isRecord(person)
272
+ && typeof person.name === 'string'
273
+ && typeof person.role === 'string'
274
+ && typeof person.bio === 'string'
275
+ && isCanonicalUrl(person.avatar, 'media', true)
276
+ && Array.isArray(person.links)
277
+ && person.links.every(link => (
278
+ isRecord(link)
279
+ && typeof link.type === 'string'
280
+ && isCanonicalUrl(link.url, 'link')
281
+ ))
282
+ ))
283
+ }
284
+
285
+ export const BLOCK_DATA_VALIDATORS = Object.freeze({
286
+ attaches: validateAttachesData,
287
+ carousel: validateCarouselData,
288
+ checklist: validateChecklistData,
289
+ code: validateCodeData,
290
+ columns: validateColumnsData,
291
+ delimiter: validateDelimiterData,
292
+ embed: validateEmbedData,
293
+ gallery: validateGalleryData,
294
+ heading: validateHeadingData,
295
+ image: validateImageData,
296
+ linkPreview: validateLinkPreviewData,
297
+ list: validateListData,
298
+ paragraph: validateParagraphData,
299
+ person: validatePersonData,
300
+ poll: validatePollData,
301
+ quote: validateQuoteData,
302
+ raw: validateRawData,
303
+ spoiler: validateSpoilerData,
304
+ table: validateTableData,
305
+ toggle: validateToggleData,
306
+ warning: validateWarningData,
307
+ })
308
+
309
+ /** @param {string} type @param {unknown} data */
310
+ export function validateKnownBlockData(type, data) {
311
+ const validator = BLOCK_DATA_VALIDATORS[type]
312
+ return validator ? validator(data) : false
313
+ }
@@ -0,0 +1,2 @@
1
+ /** Canonical order shared by synchronous and asynchronous full presets. */
2
+ export const BLOCK_TYPES: readonly ["paragraph", "heading", "list", "quote", "code", "image", "delimiter", "table", "checklist", "warning", "embed", "raw", "gallery", "carousel", "attaches", "linkPreview", "toggle", "columns", "spoiler", "poll", "person"];
@@ -0,0 +1,26 @@
1
+ // @ts-check
2
+
3
+ /** Canonical order shared by synchronous and asynchronous full presets. */
4
+ export const BLOCK_TYPES = Object.freeze(/** @type {const} */ ([
5
+ 'paragraph',
6
+ 'heading',
7
+ 'list',
8
+ 'quote',
9
+ 'code',
10
+ 'image',
11
+ 'delimiter',
12
+ 'table',
13
+ 'checklist',
14
+ 'warning',
15
+ 'embed',
16
+ 'raw',
17
+ 'gallery',
18
+ 'carousel',
19
+ 'attaches',
20
+ 'linkPreview',
21
+ 'toggle',
22
+ 'columns',
23
+ 'spoiler',
24
+ 'poll',
25
+ 'person',
26
+ ]))
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Normalize a CSS aspect-ratio value accepted by the carousel contract.
3
+ * Both numeric components must be finite and strictly positive.
4
+ *
5
+ * @param {unknown} value
6
+ * @returns {string | undefined}
7
+ */
8
+ export function normalizeCarouselAspectRatio(value: unknown): string | undefined;
9
+ /** @param {unknown} input @param {() => string} createId @returns {CarouselData} */
10
+ export function normalizeCarouselData(input: unknown, createId: () => string): CarouselData;
11
+ /** @param {unknown} data */
12
+ export function validateCarouselData(data: unknown): boolean;
13
+ export type CarouselSlide = {
14
+ id: string;
15
+ type: "image" | "video" | "html";
16
+ src?: string;
17
+ alt?: string;
18
+ caption?: string;
19
+ poster?: string;
20
+ html?: string;
21
+ };
22
+ export type CarouselOptions = {
23
+ loop: boolean;
24
+ autoplay: boolean;
25
+ autoplayDelay: number;
26
+ navigation: boolean;
27
+ pagination: boolean;
28
+ thumbnails: boolean;
29
+ aspectRatio?: string;
30
+ };
31
+ export type CarouselData = {
32
+ slides: CarouselSlide[];
33
+ options: CarouselOptions;
34
+ };