@jackuait/blok 0.4.1 → 0.4.3-beta.1
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.
- package/README.md +136 -17
- package/codemod/README.md +45 -7
- package/codemod/migrate-editorjs-to-blok.js +951 -92
- package/codemod/test.js +780 -77
- package/dist/blok.mjs +5 -2
- package/dist/chunks/blok-8ptWuVZC.mjs +12838 -0
- package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
- package/dist/chunks/i18next-loader-bLawSYRV.mjs +43 -0
- package/dist/{index-CBkApZKo.mjs → chunks/index-5nYtWZD2.mjs} +2 -2
- package/dist/chunks/inline-tool-convert-CvMDAIzb.mjs +1988 -0
- package/dist/chunks/messages-2434tVOK.mjs +47 -0
- package/dist/chunks/messages-3DcCwXMF.mjs +47 -0
- package/dist/chunks/messages-4kMwVAKY.mjs +47 -0
- package/dist/chunks/messages-57uL5htT.mjs +47 -0
- package/dist/chunks/messages-76-iJV9Q.mjs +47 -0
- package/dist/chunks/messages-8p86Eyf2.mjs +47 -0
- package/dist/chunks/messages-BBX0p0Pi.mjs +47 -0
- package/dist/chunks/messages-BCm2eudQ.mjs +47 -0
- package/dist/chunks/messages-BFiUomgG.mjs +47 -0
- package/dist/chunks/messages-BIPNHHAV.mjs +47 -0
- package/dist/chunks/messages-BUlwu9mo.mjs +47 -0
- package/dist/chunks/messages-BX-DPa-z.mjs +47 -0
- package/dist/chunks/messages-BextV3Qh.mjs +47 -0
- package/dist/chunks/messages-BiPSFlUG.mjs +47 -0
- package/dist/chunks/messages-BiXe9G-O.mjs +47 -0
- package/dist/chunks/messages-Bl5z_Igo.mjs +47 -0
- package/dist/chunks/messages-BnsE97ku.mjs +47 -0
- package/dist/chunks/messages-BoO8gsVD.mjs +47 -0
- package/dist/chunks/messages-BqWaOGMn.mjs +47 -0
- package/dist/chunks/messages-BqkL2_Ro.mjs +47 -0
- package/dist/chunks/messages-BvCkXKX-.mjs +47 -0
- package/dist/chunks/messages-C6tbPLoj.mjs +47 -0
- package/dist/chunks/messages-CA6T3-gQ.mjs +47 -0
- package/dist/chunks/messages-CFFPFdWP.mjs +47 -0
- package/dist/chunks/messages-CFrKE-TN.mjs +47 -0
- package/dist/chunks/messages-CHz8VlG-.mjs +47 -0
- package/dist/chunks/messages-CLixzySl.mjs +47 -0
- package/dist/chunks/messages-CV7OM_qk.mjs +47 -0
- package/dist/chunks/messages-CXHt3eCC.mjs +47 -0
- package/dist/chunks/messages-CbmsBrB0.mjs +47 -0
- package/dist/chunks/messages-Ceo1KtFx.mjs +47 -0
- package/dist/chunks/messages-Cm0LJLtB.mjs +47 -0
- package/dist/chunks/messages-CmymP_Ar.mjs +47 -0
- package/dist/chunks/messages-D0ohMB5H.mjs +47 -0
- package/dist/chunks/messages-D3GrDwXh.mjs +47 -0
- package/dist/chunks/messages-D3vTzIpL.mjs +47 -0
- package/dist/chunks/messages-D5WeksbV.mjs +47 -0
- package/dist/chunks/messages-DGaab4EP.mjs +47 -0
- package/dist/chunks/messages-DKha57ZU.mjs +47 -0
- package/dist/chunks/messages-DOaujgMW.mjs +47 -0
- package/dist/chunks/messages-DVbPLd_0.mjs +47 -0
- package/dist/chunks/messages-D_FCyfW6.mjs +47 -0
- package/dist/chunks/messages-Dd5iZN3c.mjs +47 -0
- package/dist/chunks/messages-DehM7135.mjs +47 -0
- package/dist/chunks/messages-Dg1OHftD.mjs +47 -0
- package/dist/chunks/messages-Di6Flq-b.mjs +47 -0
- package/dist/chunks/messages-Dqhhex6e.mjs +47 -0
- package/dist/chunks/messages-DueVe0F1.mjs +47 -0
- package/dist/chunks/messages-Dx3eFwI0.mjs +47 -0
- package/dist/chunks/messages-FOtiUoKl.mjs +47 -0
- package/dist/chunks/messages-FTOZNhRD.mjs +47 -0
- package/dist/chunks/messages-IQxGfQIV.mjs +47 -0
- package/dist/chunks/messages-JF2fzCkK.mjs +47 -0
- package/dist/chunks/messages-MOGl7I5v.mjs +47 -0
- package/dist/chunks/messages-QgYhPL-3.mjs +47 -0
- package/dist/chunks/messages-WYWIbQwo.mjs +47 -0
- package/dist/chunks/messages-a6A_LgDv.mjs +47 -0
- package/dist/chunks/messages-bSf31LJi.mjs +47 -0
- package/dist/chunks/messages-diGozhTn.mjs +47 -0
- package/dist/chunks/messages-er-kd-VO.mjs +47 -0
- package/dist/chunks/messages-ez3w5NBn.mjs +47 -0
- package/dist/chunks/messages-f3uXjegd.mjs +47 -0
- package/dist/chunks/messages-ohwI1UGv.mjs +47 -0
- package/dist/chunks/messages-p9BZJaFV.mjs +47 -0
- package/dist/chunks/messages-qIQ4L4rw.mjs +47 -0
- package/dist/chunks/messages-qWkXPggi.mjs +47 -0
- package/dist/chunks/messages-w5foGze_.mjs +47 -0
- package/dist/full.mjs +50 -0
- package/dist/locales.mjs +227 -0
- package/dist/messages-2434tVOK.mjs +47 -0
- package/dist/messages-3DcCwXMF.mjs +47 -0
- package/dist/messages-4kMwVAKY.mjs +47 -0
- package/dist/messages-57uL5htT.mjs +47 -0
- package/dist/messages-76-iJV9Q.mjs +47 -0
- package/dist/messages-8p86Eyf2.mjs +47 -0
- package/dist/messages-BBX0p0Pi.mjs +47 -0
- package/dist/messages-BCm2eudQ.mjs +47 -0
- package/dist/messages-BFiUomgG.mjs +47 -0
- package/dist/messages-BIPNHHAV.mjs +47 -0
- package/dist/messages-BUlwu9mo.mjs +47 -0
- package/dist/messages-BX-DPa-z.mjs +47 -0
- package/dist/messages-BextV3Qh.mjs +47 -0
- package/dist/messages-BiPSFlUG.mjs +47 -0
- package/dist/messages-BiXe9G-O.mjs +47 -0
- package/dist/messages-Bl5z_Igo.mjs +47 -0
- package/dist/messages-BnsE97ku.mjs +47 -0
- package/dist/messages-BoO8gsVD.mjs +47 -0
- package/dist/messages-BqWaOGMn.mjs +47 -0
- package/dist/messages-BqkL2_Ro.mjs +47 -0
- package/dist/messages-BvCkXKX-.mjs +47 -0
- package/dist/messages-C6tbPLoj.mjs +47 -0
- package/dist/messages-CA6T3-gQ.mjs +47 -0
- package/dist/messages-CFFPFdWP.mjs +47 -0
- package/dist/messages-CFrKE-TN.mjs +47 -0
- package/dist/messages-CHz8VlG-.mjs +47 -0
- package/dist/messages-CLixzySl.mjs +47 -0
- package/dist/messages-CV7OM_qk.mjs +47 -0
- package/dist/messages-CXHt3eCC.mjs +47 -0
- package/dist/messages-CbmsBrB0.mjs +47 -0
- package/dist/messages-Ceo1KtFx.mjs +47 -0
- package/dist/messages-Cm0LJLtB.mjs +47 -0
- package/dist/messages-CmymP_Ar.mjs +47 -0
- package/dist/messages-D0ohMB5H.mjs +47 -0
- package/dist/messages-D3GrDwXh.mjs +47 -0
- package/dist/messages-D3vTzIpL.mjs +47 -0
- package/dist/messages-D5WeksbV.mjs +47 -0
- package/dist/messages-DGaab4EP.mjs +47 -0
- package/dist/messages-DKha57ZU.mjs +47 -0
- package/dist/messages-DOaujgMW.mjs +47 -0
- package/dist/messages-DVbPLd_0.mjs +47 -0
- package/dist/messages-D_FCyfW6.mjs +47 -0
- package/dist/messages-Dd5iZN3c.mjs +47 -0
- package/dist/messages-DehM7135.mjs +47 -0
- package/dist/messages-Dg1OHftD.mjs +47 -0
- package/dist/messages-Di6Flq-b.mjs +47 -0
- package/dist/messages-Dqhhex6e.mjs +47 -0
- package/dist/messages-DueVe0F1.mjs +47 -0
- package/dist/messages-Dx3eFwI0.mjs +47 -0
- package/dist/messages-FOtiUoKl.mjs +47 -0
- package/dist/messages-FTOZNhRD.mjs +47 -0
- package/dist/messages-IQxGfQIV.mjs +47 -0
- package/dist/messages-JF2fzCkK.mjs +47 -0
- package/dist/messages-MOGl7I5v.mjs +47 -0
- package/dist/messages-QgYhPL-3.mjs +47 -0
- package/dist/messages-WYWIbQwo.mjs +47 -0
- package/dist/messages-a6A_LgDv.mjs +47 -0
- package/dist/messages-bSf31LJi.mjs +47 -0
- package/dist/messages-diGozhTn.mjs +47 -0
- package/dist/messages-er-kd-VO.mjs +47 -0
- package/dist/messages-ez3w5NBn.mjs +47 -0
- package/dist/messages-f3uXjegd.mjs +47 -0
- package/dist/messages-ohwI1UGv.mjs +47 -0
- package/dist/messages-p9BZJaFV.mjs +47 -0
- package/dist/messages-qIQ4L4rw.mjs +47 -0
- package/dist/messages-qWkXPggi.mjs +47 -0
- package/dist/messages-w5foGze_.mjs +47 -0
- package/dist/tools.mjs +3073 -0
- package/dist/vendor.LICENSE.txt +59 -156
- package/package.json +60 -15
- package/src/blok.ts +267 -0
- package/src/components/__module.ts +139 -0
- package/src/components/block/api.ts +155 -0
- package/src/components/block/index.ts +1427 -0
- package/src/components/block-tunes/block-tune-delete.ts +51 -0
- package/src/components/blocks.ts +338 -0
- package/src/components/constants/data-attributes.ts +342 -0
- package/src/components/constants.ts +76 -0
- package/src/components/core.ts +392 -0
- package/src/components/dom.ts +773 -0
- package/src/components/domIterator.ts +189 -0
- package/src/components/errors/critical.ts +5 -0
- package/src/components/events/BlockChanged.ts +16 -0
- package/src/components/events/BlockHovered.ts +21 -0
- package/src/components/events/BlockSettingsClosed.ts +12 -0
- package/src/components/events/BlockSettingsOpened.ts +12 -0
- package/src/components/events/BlokMobileLayoutToggled.ts +15 -0
- package/src/components/events/FakeCursorAboutToBeToggled.ts +17 -0
- package/src/components/events/FakeCursorHaveBeenSet.ts +17 -0
- package/src/components/events/HistoryStateChanged.ts +19 -0
- package/src/components/events/RedactorDomChanged.ts +14 -0
- package/src/components/events/index.ts +46 -0
- package/src/components/flipper.ts +481 -0
- package/src/components/i18n/i18next-loader.ts +84 -0
- package/src/components/i18n/lightweight-i18n.ts +86 -0
- package/src/components/i18n/locales/TRANSLATION_GUIDELINES.md +113 -0
- package/src/components/i18n/locales/am/messages.json +44 -0
- package/src/components/i18n/locales/ar/messages.json +44 -0
- package/src/components/i18n/locales/az/messages.json +44 -0
- package/src/components/i18n/locales/bg/messages.json +44 -0
- package/src/components/i18n/locales/bn/messages.json +44 -0
- package/src/components/i18n/locales/bs/messages.json +44 -0
- package/src/components/i18n/locales/cs/messages.json +44 -0
- package/src/components/i18n/locales/da/messages.json +44 -0
- package/src/components/i18n/locales/de/messages.json +44 -0
- package/src/components/i18n/locales/dv/messages.json +44 -0
- package/src/components/i18n/locales/el/messages.json +44 -0
- package/src/components/i18n/locales/en/messages.json +44 -0
- package/src/components/i18n/locales/es/messages.json +44 -0
- package/src/components/i18n/locales/et/messages.json +44 -0
- package/src/components/i18n/locales/fa/messages.json +44 -0
- package/src/components/i18n/locales/fi/messages.json +44 -0
- package/src/components/i18n/locales/fil/messages.json +44 -0
- package/src/components/i18n/locales/fr/messages.json +44 -0
- package/src/components/i18n/locales/gu/messages.json +44 -0
- package/src/components/i18n/locales/he/messages.json +44 -0
- package/src/components/i18n/locales/hi/messages.json +44 -0
- package/src/components/i18n/locales/hr/messages.json +44 -0
- package/src/components/i18n/locales/hu/messages.json +44 -0
- package/src/components/i18n/locales/hy/messages.json +44 -0
- package/src/components/i18n/locales/id/messages.json +44 -0
- package/src/components/i18n/locales/index.ts +225 -0
- package/src/components/i18n/locales/it/messages.json +44 -0
- package/src/components/i18n/locales/ja/messages.json +44 -0
- package/src/components/i18n/locales/ka/messages.json +44 -0
- package/src/components/i18n/locales/km/messages.json +44 -0
- package/src/components/i18n/locales/kn/messages.json +44 -0
- package/src/components/i18n/locales/ko/messages.json +44 -0
- package/src/components/i18n/locales/ku/messages.json +44 -0
- package/src/components/i18n/locales/lo/messages.json +44 -0
- package/src/components/i18n/locales/lt/messages.json +44 -0
- package/src/components/i18n/locales/lv/messages.json +44 -0
- package/src/components/i18n/locales/mk/messages.json +44 -0
- package/src/components/i18n/locales/ml/messages.json +44 -0
- package/src/components/i18n/locales/mn/messages.json +44 -0
- package/src/components/i18n/locales/mr/messages.json +44 -0
- package/src/components/i18n/locales/ms/messages.json +44 -0
- package/src/components/i18n/locales/my/messages.json +44 -0
- package/src/components/i18n/locales/ne/messages.json +44 -0
- package/src/components/i18n/locales/nl/messages.json +44 -0
- package/src/components/i18n/locales/no/messages.json +44 -0
- package/src/components/i18n/locales/pa/messages.json +44 -0
- package/src/components/i18n/locales/pl/messages.json +44 -0
- package/src/components/i18n/locales/ps/messages.json +44 -0
- package/src/components/i18n/locales/pt/messages.json +44 -0
- package/src/components/i18n/locales/ro/messages.json +44 -0
- package/src/components/i18n/locales/ru/messages.json +44 -0
- package/src/components/i18n/locales/sd/messages.json +44 -0
- package/src/components/i18n/locales/si/messages.json +44 -0
- package/src/components/i18n/locales/sk/messages.json +44 -0
- package/src/components/i18n/locales/sl/messages.json +44 -0
- package/src/components/i18n/locales/sq/messages.json +44 -0
- package/src/components/i18n/locales/sr/messages.json +44 -0
- package/src/components/i18n/locales/sv/messages.json +44 -0
- package/src/components/i18n/locales/sw/messages.json +44 -0
- package/src/components/i18n/locales/ta/messages.json +44 -0
- package/src/components/i18n/locales/te/messages.json +44 -0
- package/src/components/i18n/locales/th/messages.json +44 -0
- package/src/components/i18n/locales/tr/messages.json +44 -0
- package/src/components/i18n/locales/ug/messages.json +44 -0
- package/src/components/i18n/locales/uk/messages.json +44 -0
- package/src/components/i18n/locales/ur/messages.json +44 -0
- package/src/components/i18n/locales/vi/messages.json +44 -0
- package/src/components/i18n/locales/yi/messages.json +44 -0
- package/src/components/i18n/locales/zh/messages.json +44 -0
- package/src/components/icons/index.ts +242 -0
- package/src/components/inline-tools/inline-tool-bold.ts +2213 -0
- package/src/components/inline-tools/inline-tool-convert.ts +141 -0
- package/src/components/inline-tools/inline-tool-italic.ts +500 -0
- package/src/components/inline-tools/inline-tool-link.ts +539 -0
- package/src/components/modules/api/blocks.ts +363 -0
- package/src/components/modules/api/caret.ts +125 -0
- package/src/components/modules/api/events.ts +51 -0
- package/src/components/modules/api/history.ts +73 -0
- package/src/components/modules/api/i18n.ts +33 -0
- package/src/components/modules/api/index.ts +39 -0
- package/src/components/modules/api/inlineToolbar.ts +33 -0
- package/src/components/modules/api/listeners.ts +56 -0
- package/src/components/modules/api/notifier.ts +46 -0
- package/src/components/modules/api/readonly.ts +39 -0
- package/src/components/modules/api/sanitizer.ts +30 -0
- package/src/components/modules/api/saver.ts +52 -0
- package/src/components/modules/api/selection.ts +48 -0
- package/src/components/modules/api/styles.ts +72 -0
- package/src/components/modules/api/toolbar.ts +79 -0
- package/src/components/modules/api/tools.ts +16 -0
- package/src/components/modules/api/tooltip.ts +67 -0
- package/src/components/modules/api/ui.ts +36 -0
- package/src/components/modules/blockEvents.ts +1375 -0
- package/src/components/modules/blockManager.ts +1348 -0
- package/src/components/modules/blockSelection.ts +708 -0
- package/src/components/modules/caret.ts +853 -0
- package/src/components/modules/crossBlockSelection.ts +329 -0
- package/src/components/modules/dragManager.ts +1141 -0
- package/src/components/modules/history.ts +1098 -0
- package/src/components/modules/i18n.ts +325 -0
- package/src/components/modules/index.ts +139 -0
- package/src/components/modules/modificationsObserver.ts +147 -0
- package/src/components/modules/paste.ts +1092 -0
- package/src/components/modules/readonly.ts +136 -0
- package/src/components/modules/rectangleSelection.ts +668 -0
- package/src/components/modules/renderer.ts +155 -0
- package/src/components/modules/saver.ts +283 -0
- package/src/components/modules/toolbar/blockSettings.ts +776 -0
- package/src/components/modules/toolbar/index.ts +1311 -0
- package/src/components/modules/toolbar/inline.ts +956 -0
- package/src/components/modules/tools.ts +589 -0
- package/src/components/modules/ui.ts +1179 -0
- package/src/components/polyfills.ts +113 -0
- package/src/components/selection.ts +1189 -0
- package/src/components/tools/base.ts +274 -0
- package/src/components/tools/block.ts +291 -0
- package/src/components/tools/collection.ts +67 -0
- package/src/components/tools/factory.ts +85 -0
- package/src/components/tools/inline.ts +71 -0
- package/src/components/tools/tune.ts +33 -0
- package/src/components/ui/toolbox.ts +497 -0
- package/src/components/utils/announcer.ts +205 -0
- package/src/components/utils/api.ts +20 -0
- package/src/components/utils/bem.ts +26 -0
- package/src/components/utils/blocks.ts +284 -0
- package/src/components/utils/caret.ts +1067 -0
- package/src/components/utils/data-model-transform.ts +382 -0
- package/src/components/utils/events.ts +117 -0
- package/src/components/utils/keyboard.ts +60 -0
- package/src/components/utils/listeners.ts +296 -0
- package/src/components/utils/mutations.ts +39 -0
- package/src/components/utils/notifier/draw.ts +190 -0
- package/src/components/utils/notifier/index.ts +66 -0
- package/src/components/utils/notifier/types.ts +1 -0
- package/src/components/utils/notifier.ts +77 -0
- package/src/components/utils/placeholder.ts +140 -0
- package/src/components/utils/popover/components/hint/hint.const.ts +10 -0
- package/src/components/utils/popover/components/hint/hint.ts +46 -0
- package/src/components/utils/popover/components/hint/index.ts +6 -0
- package/src/components/utils/popover/components/popover-header/index.ts +2 -0
- package/src/components/utils/popover/components/popover-header/popover-header.const.ts +8 -0
- package/src/components/utils/popover/components/popover-header/popover-header.ts +80 -0
- package/src/components/utils/popover/components/popover-header/popover-header.types.ts +14 -0
- package/src/components/utils/popover/components/popover-item/index.ts +13 -0
- package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.const.ts +50 -0
- package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.ts +666 -0
- package/src/components/utils/popover/components/popover-item/popover-item-html/popover-item-html.const.ts +14 -0
- package/src/components/utils/popover/components/popover-item/popover-item-html/popover-item-html.ts +136 -0
- package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.const.ts +20 -0
- package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.ts +117 -0
- package/src/components/utils/popover/components/popover-item/popover-item.ts +187 -0
- package/src/components/utils/popover/components/search-input/index.ts +2 -0
- package/src/components/utils/popover/components/search-input/search-input.const.ts +8 -0
- package/src/components/utils/popover/components/search-input/search-input.ts +181 -0
- package/src/components/utils/popover/components/search-input/search-input.types.ts +30 -0
- package/src/components/utils/popover/index.ts +13 -0
- package/src/components/utils/popover/popover-abstract.ts +448 -0
- package/src/components/utils/popover/popover-desktop.ts +643 -0
- package/src/components/utils/popover/popover-inline.ts +338 -0
- package/src/components/utils/popover/popover-mobile.ts +201 -0
- package/src/components/utils/popover/popover.const.ts +81 -0
- package/src/components/utils/popover/utils/popover-states-history.ts +72 -0
- package/src/components/utils/promise-queue.ts +43 -0
- package/src/components/utils/sanitizer.ts +537 -0
- package/src/components/utils/scroll-locker.ts +87 -0
- package/src/components/utils/shortcut.ts +231 -0
- package/src/components/utils/shortcuts.ts +113 -0
- package/src/components/utils/tools.ts +105 -0
- package/src/components/utils/tooltip.ts +642 -0
- package/src/components/utils/tw.ts +241 -0
- package/src/components/utils.ts +1081 -0
- package/src/env.d.ts +13 -0
- package/src/full.ts +69 -0
- package/src/locales.ts +51 -0
- package/src/stories/Block.stories.ts +498 -0
- package/src/stories/EditorModes.stories.ts +505 -0
- package/src/stories/Header.stories.ts +137 -0
- package/src/stories/InlineToolbar.stories.ts +498 -0
- package/src/stories/List.stories.ts +259 -0
- package/src/stories/Notifier.stories.ts +340 -0
- package/src/stories/Paragraph.stories.ts +112 -0
- package/src/stories/Placeholder.stories.ts +319 -0
- package/src/stories/Popover.stories.ts +844 -0
- package/src/stories/Selection.stories.ts +250 -0
- package/src/stories/StubBlock.stories.ts +156 -0
- package/src/stories/Toolbar.stories.ts +223 -0
- package/src/stories/Toolbox.stories.ts +166 -0
- package/src/stories/Tooltip.stories.ts +198 -0
- package/src/stories/helpers.ts +463 -0
- package/src/styles/main.css +123 -0
- package/src/tools/header/index.ts +570 -0
- package/src/tools/index.ts +38 -0
- package/src/tools/list/index.ts +1803 -0
- package/src/tools/paragraph/index.ts +411 -0
- package/src/tools/stub/index.ts +107 -0
- package/src/types-internal/blok-modules.d.ts +87 -0
- package/src/types-internal/html-janitor.d.ts +28 -0
- package/src/types-internal/module-config.d.ts +11 -0
- package/src/variants/all-locales.ts +155 -0
- package/src/variants/blok-maximum.ts +20 -0
- package/src/variants/blok-minimum.ts +243 -0
- package/types/api/blocks.d.ts +1 -1
- package/types/api/i18n.d.ts +5 -3
- package/types/api/selection.d.ts +6 -0
- package/types/api/styles.d.ts +0 -5
- package/types/configs/blok-config.d.ts +21 -0
- package/types/configs/i18n-config.d.ts +52 -2
- package/types/configs/i18n-dictionary.d.ts +16 -90
- package/types/data-attributes.d.ts +169 -0
- package/types/data-formats/output-data.d.ts +15 -0
- package/types/full.d.ts +80 -0
- package/types/index.d.ts +9 -24
- package/types/locales.d.ts +59 -0
- package/types/tools/adapters/inline-tool-adapter.d.ts +10 -0
- package/types/tools/block-tool.d.ts +9 -0
- package/types/tools/list.d.ts +25 -18
- package/types/tools/tool-settings.d.ts +8 -1
- package/types/tools/tool.d.ts +6 -0
- package/types/tools-entry.d.ts +49 -0
- package/types/utils/popover/popover-item.d.ts +0 -5
- package/dist/blok-BwPfU8ro.mjs +0 -21510
- package/dist/blok.umd.js +0 -198
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header Tool for the Blok Editor
|
|
3
|
+
* Provides Headings Blocks (H1-H6)
|
|
4
|
+
*
|
|
5
|
+
* Based on @editorjs/header by CodeX
|
|
6
|
+
* @license MIT
|
|
7
|
+
*/
|
|
8
|
+
import { IconH1, IconH2, IconH3, IconH4, IconH5, IconH6, IconHeading } from '../../components/icons';
|
|
9
|
+
import { twMerge } from '../../components/utils/tw';
|
|
10
|
+
import { DATA_ATTR } from '../../components/constants';
|
|
11
|
+
import { PLACEHOLDER_CLASSES, setupPlaceholder } from '../../components/utils/placeholder';
|
|
12
|
+
import type {
|
|
13
|
+
API,
|
|
14
|
+
BlockTool,
|
|
15
|
+
BlockToolConstructorOptions,
|
|
16
|
+
BlockToolData,
|
|
17
|
+
PasteEvent,
|
|
18
|
+
ToolboxConfig,
|
|
19
|
+
ConversionConfig,
|
|
20
|
+
SanitizerConfig,
|
|
21
|
+
PasteConfig,
|
|
22
|
+
} from '../../../types';
|
|
23
|
+
import type { MenuConfig } from '../../../types/tools/menu-config';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Tool's input and output data format
|
|
27
|
+
*/
|
|
28
|
+
export interface HeaderData extends BlockToolData {
|
|
29
|
+
/** Header's content */
|
|
30
|
+
text: string;
|
|
31
|
+
/** Header's level from 1 to 6 */
|
|
32
|
+
level: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Level-specific overrides for customization
|
|
37
|
+
*/
|
|
38
|
+
export interface HeaderLevelConfig {
|
|
39
|
+
/** Custom HTML tag to use (e.g., 'div', 'p', 'span') */
|
|
40
|
+
tag?: string;
|
|
41
|
+
/** Custom display name for this level */
|
|
42
|
+
name?: string;
|
|
43
|
+
/** Custom font size (e.g., '3em', '24px') */
|
|
44
|
+
size?: string;
|
|
45
|
+
/** Custom margin top (e.g., '20px', '1rem') */
|
|
46
|
+
marginTop?: string;
|
|
47
|
+
/** Custom margin bottom (e.g., '10px', '0.5rem') */
|
|
48
|
+
marginBottom?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Tool's config from Editor
|
|
53
|
+
*/
|
|
54
|
+
export interface HeaderConfig {
|
|
55
|
+
/** Block's placeholder */
|
|
56
|
+
placeholder?: string;
|
|
57
|
+
/** Heading levels */
|
|
58
|
+
levels?: number[];
|
|
59
|
+
/** Default level */
|
|
60
|
+
defaultLevel?: number;
|
|
61
|
+
/** Level-specific overrides keyed by level number (1-6) */
|
|
62
|
+
levelOverrides?: Record<number, HeaderLevelConfig>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Heading level information
|
|
67
|
+
*/
|
|
68
|
+
interface Level {
|
|
69
|
+
/** Level number */
|
|
70
|
+
number: number;
|
|
71
|
+
/** HTML tag corresponding with level number */
|
|
72
|
+
tag: string;
|
|
73
|
+
/** Translation key for this level (e.g., 'tools.header.heading1') */
|
|
74
|
+
nameKey: string;
|
|
75
|
+
/** Display name for this level (user override or fallback) */
|
|
76
|
+
name: string;
|
|
77
|
+
/** Icon */
|
|
78
|
+
icon: string;
|
|
79
|
+
/** Tailwind classes for styling */
|
|
80
|
+
styles: string;
|
|
81
|
+
/** Inline styles for custom overrides */
|
|
82
|
+
inlineStyles: Partial<CSSStyleDeclaration>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Header block for the Blok Editor.
|
|
87
|
+
*
|
|
88
|
+
* @author CodeX (team@ifmo.su)
|
|
89
|
+
* @copyright CodeX 2018
|
|
90
|
+
* @license MIT
|
|
91
|
+
* @version 2.0.0
|
|
92
|
+
*/
|
|
93
|
+
export class Header implements BlockTool {
|
|
94
|
+
/**
|
|
95
|
+
* Editor API
|
|
96
|
+
*/
|
|
97
|
+
private api: API;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Read-only mode flag
|
|
101
|
+
*/
|
|
102
|
+
private readOnly: boolean;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Tool's settings passed from Editor
|
|
106
|
+
*/
|
|
107
|
+
private _settings: HeaderConfig;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Block's data
|
|
111
|
+
*/
|
|
112
|
+
private _data: HeaderData;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Main Block wrapper
|
|
116
|
+
*/
|
|
117
|
+
private _element: HTMLHeadingElement;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Render plugin's main Element and fill it with saved data
|
|
121
|
+
*
|
|
122
|
+
* @param options - constructor options
|
|
123
|
+
* @param options.data - previously saved data
|
|
124
|
+
* @param options.config - user config for Tool
|
|
125
|
+
* @param options.api - Editor API
|
|
126
|
+
* @param options.readOnly - read only mode flag
|
|
127
|
+
*/
|
|
128
|
+
constructor({ data, config, api, readOnly }: BlockToolConstructorOptions<HeaderData, HeaderConfig>) {
|
|
129
|
+
this.api = api;
|
|
130
|
+
this.readOnly = readOnly;
|
|
131
|
+
|
|
132
|
+
this._settings = config || {};
|
|
133
|
+
this._data = this.normalizeData(data);
|
|
134
|
+
this._element = this.getTag();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Base styles for all header levels
|
|
139
|
+
*/
|
|
140
|
+
private static readonly BASE_STYLES = 'py-[3px] px-[2px] m-0 !leading-[1.3] outline-none [&_p]:!p-0 [&_p]:!m-0 [&_div]:!p-0 [&_div]:!m-0';
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Styles
|
|
144
|
+
* @deprecated Use data-blok-tool attribute instead (DATA_ATTR.tool)
|
|
145
|
+
*/
|
|
146
|
+
private get _CSS(): { block: string; wrapper: string } {
|
|
147
|
+
return {
|
|
148
|
+
block: this.api.styles.block,
|
|
149
|
+
wrapper: '',
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Check if data is valid HeaderData
|
|
155
|
+
*
|
|
156
|
+
* @param data - data to check
|
|
157
|
+
* @returns true if data is HeaderData
|
|
158
|
+
*/
|
|
159
|
+
private isHeaderData(data: unknown): data is HeaderData {
|
|
160
|
+
return typeof data === 'object' && data !== null && 'text' in data;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Normalize input data
|
|
165
|
+
*
|
|
166
|
+
* @param data - saved data to process
|
|
167
|
+
* @returns normalized HeaderData
|
|
168
|
+
*/
|
|
169
|
+
private normalizeData(data: HeaderData | Record<string, never>): HeaderData {
|
|
170
|
+
if (!this.isHeaderData(data)) {
|
|
171
|
+
return { text: '', level: this.defaultLevel.number };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const parsedLevel = parseInt(String(data.level));
|
|
175
|
+
const isValidLevel = data.level !== undefined && !isNaN(parsedLevel);
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
text: data.text || '',
|
|
179
|
+
level: isValidLevel ? parsedLevel : this.defaultLevel.number,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Return Tool's view
|
|
185
|
+
*
|
|
186
|
+
* @returns HTMLHeadingElement
|
|
187
|
+
*/
|
|
188
|
+
public render(): HTMLHeadingElement {
|
|
189
|
+
return this._element;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Returns header block tunes config
|
|
194
|
+
*
|
|
195
|
+
* @returns MenuConfig array
|
|
196
|
+
*/
|
|
197
|
+
public renderSettings(): MenuConfig {
|
|
198
|
+
return this.levels.map(level => {
|
|
199
|
+
const translated = this.api.i18n.t(level.nameKey);
|
|
200
|
+
const title = translated !== level.nameKey ? translated : level.name;
|
|
201
|
+
|
|
202
|
+
return {
|
|
203
|
+
icon: level.icon,
|
|
204
|
+
title,
|
|
205
|
+
onActivate: (): void => this.setLevel(level.number),
|
|
206
|
+
closeOnActivate: true,
|
|
207
|
+
isActive: this.currentLevel.number === level.number,
|
|
208
|
+
dataset: {
|
|
209
|
+
'blok-header-level': String(level.number),
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Callback for Block's settings buttons
|
|
217
|
+
*
|
|
218
|
+
* @param level - level to set
|
|
219
|
+
*/
|
|
220
|
+
private setLevel(level: number): void {
|
|
221
|
+
this.data = {
|
|
222
|
+
level: level,
|
|
223
|
+
text: this.data.text,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Method that specified how to merge two Text blocks.
|
|
229
|
+
* Called by Editor by backspace at the beginning of the Block
|
|
230
|
+
*
|
|
231
|
+
* @param data - saved data to merge with current block
|
|
232
|
+
*/
|
|
233
|
+
public merge(data: HeaderData): void {
|
|
234
|
+
this._element.insertAdjacentHTML('beforeend', data.text);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Validate Text block data:
|
|
239
|
+
* - check for emptiness
|
|
240
|
+
*
|
|
241
|
+
* @param blockData - data received after saving
|
|
242
|
+
* @returns false if saved data is not correct, otherwise true
|
|
243
|
+
*/
|
|
244
|
+
public validate(blockData: HeaderData): boolean {
|
|
245
|
+
return blockData.text.trim() !== '';
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Extract Tool's data from the view
|
|
250
|
+
*
|
|
251
|
+
* @param toolsContent - Text tools rendered view
|
|
252
|
+
* @returns saved data
|
|
253
|
+
*/
|
|
254
|
+
public save(toolsContent: HTMLHeadingElement): HeaderData {
|
|
255
|
+
return {
|
|
256
|
+
text: toolsContent.innerHTML,
|
|
257
|
+
level: this.currentLevel.number,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Allow Header to be converted to/from other blocks
|
|
263
|
+
*/
|
|
264
|
+
public static get conversionConfig(): ConversionConfig {
|
|
265
|
+
return {
|
|
266
|
+
export: 'text', // use 'text' property for other blocks
|
|
267
|
+
import: 'text', // fill 'text' property from other block's export string
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Sanitizer Rules
|
|
273
|
+
*/
|
|
274
|
+
public static get sanitize(): SanitizerConfig {
|
|
275
|
+
return {
|
|
276
|
+
level: false,
|
|
277
|
+
text: {},
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Returns true to notify core that read-only is supported
|
|
283
|
+
*
|
|
284
|
+
* @returns true
|
|
285
|
+
*/
|
|
286
|
+
public static get isReadOnlySupported(): boolean {
|
|
287
|
+
return true;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Get current Tool's data
|
|
292
|
+
*
|
|
293
|
+
* @returns Current data
|
|
294
|
+
*/
|
|
295
|
+
public get data(): HeaderData {
|
|
296
|
+
this._data.text = this._element.innerHTML;
|
|
297
|
+
this._data.level = this.currentLevel.number;
|
|
298
|
+
|
|
299
|
+
return this._data;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Store data in plugin:
|
|
304
|
+
* - at the this._data property
|
|
305
|
+
* - at the HTML
|
|
306
|
+
*
|
|
307
|
+
* @param data - data to set
|
|
308
|
+
*/
|
|
309
|
+
public set data(data: HeaderData) {
|
|
310
|
+
this._data = this.normalizeData(data);
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* If level is set and block in DOM
|
|
314
|
+
* then replace it to a new block
|
|
315
|
+
*/
|
|
316
|
+
if (data.level !== undefined && this._element.parentNode) {
|
|
317
|
+
/**
|
|
318
|
+
* Create a new tag
|
|
319
|
+
*/
|
|
320
|
+
const newHeader = this.getTag();
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Save Block's content
|
|
324
|
+
*/
|
|
325
|
+
newHeader.innerHTML = this._element.innerHTML;
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Replace blocks
|
|
329
|
+
*/
|
|
330
|
+
this._element.parentNode.replaceChild(newHeader, this._element);
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Save new block to private variable
|
|
334
|
+
*/
|
|
335
|
+
this._element = newHeader;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* If data.text was passed then update block's content
|
|
340
|
+
*/
|
|
341
|
+
if (data.text !== undefined) {
|
|
342
|
+
this._element.innerHTML = this._data.text || '';
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Get tag for target level
|
|
348
|
+
* By default returns second-leveled header
|
|
349
|
+
*
|
|
350
|
+
* @returns HTMLHeadingElement
|
|
351
|
+
*/
|
|
352
|
+
private getTag(): HTMLHeadingElement {
|
|
353
|
+
/**
|
|
354
|
+
* Create element for current Block's level
|
|
355
|
+
*/
|
|
356
|
+
const tag = document.createElement(this.currentLevel.tag) as HTMLHeadingElement;
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Add text to block
|
|
360
|
+
*/
|
|
361
|
+
tag.innerHTML = this._data.text || '';
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Add styles class using twMerge to combine base and level-specific styles
|
|
365
|
+
*/
|
|
366
|
+
tag.className = twMerge(Header.BASE_STYLES, this.currentLevel.styles, PLACEHOLDER_CLASSES);
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Apply inline styles for custom overrides (dynamic values from config)
|
|
370
|
+
*/
|
|
371
|
+
const { inlineStyles } = this.currentLevel;
|
|
372
|
+
|
|
373
|
+
if (inlineStyles) {
|
|
374
|
+
Object.assign(tag.style, inlineStyles);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Set data attribute for tool identification
|
|
379
|
+
*/
|
|
380
|
+
tag.setAttribute(DATA_ATTR.tool, 'header');
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Make tag editable
|
|
384
|
+
*/
|
|
385
|
+
tag.contentEditable = this.readOnly ? 'false' : 'true';
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Add Placeholder with caret positioning support
|
|
389
|
+
*/
|
|
390
|
+
if (!this.readOnly) {
|
|
391
|
+
setupPlaceholder(tag, this.api.i18n.t(this._settings.placeholder || ''));
|
|
392
|
+
} else {
|
|
393
|
+
tag.setAttribute('data-placeholder', this.api.i18n.t(this._settings.placeholder || ''));
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
return tag;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Get current level
|
|
401
|
+
*
|
|
402
|
+
* @returns Level object
|
|
403
|
+
*/
|
|
404
|
+
private get currentLevel(): Level {
|
|
405
|
+
const level = this.levels.find(levelItem => levelItem.number === this._data.level);
|
|
406
|
+
|
|
407
|
+
return level ?? this.defaultLevel;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Return default level
|
|
412
|
+
*
|
|
413
|
+
* @returns Level object
|
|
414
|
+
*/
|
|
415
|
+
private get defaultLevel(): Level {
|
|
416
|
+
/**
|
|
417
|
+
* User can specify own default level value
|
|
418
|
+
*/
|
|
419
|
+
if (!this._settings.defaultLevel) {
|
|
420
|
+
/**
|
|
421
|
+
* With no additional options, there will be H2 by default
|
|
422
|
+
*/
|
|
423
|
+
return this.levels[1];
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
const userSpecified = this.levels.find(levelItem => {
|
|
427
|
+
return levelItem.number === this._settings.defaultLevel;
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
if (userSpecified) {
|
|
431
|
+
return userSpecified;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
console.warn('(ง\'̀-\'́)ง Heading Tool: the default level specified was not found in available levels');
|
|
435
|
+
|
|
436
|
+
return this.levels[1];
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Default level configurations using Tailwind CSS classes
|
|
441
|
+
*/
|
|
442
|
+
private static readonly DEFAULT_LEVELS: Array<{
|
|
443
|
+
number: number;
|
|
444
|
+
tag: string;
|
|
445
|
+
nameKey: string;
|
|
446
|
+
name: string;
|
|
447
|
+
icon: string;
|
|
448
|
+
styles: string;
|
|
449
|
+
}> = [
|
|
450
|
+
{ number: 1, tag: 'H1', nameKey: 'tools.header.heading1', name: 'Heading 1', icon: IconH1, styles: 'text-4xl font-bold mt-8 mb-1' },
|
|
451
|
+
{ number: 2, tag: 'H2', nameKey: 'tools.header.heading2', name: 'Heading 2', icon: IconH2, styles: 'text-3xl font-semibold mt-6 mb-px' },
|
|
452
|
+
{ number: 3, tag: 'H3', nameKey: 'tools.header.heading3', name: 'Heading 3', icon: IconH3, styles: 'text-2xl font-semibold mt-4 mb-px' },
|
|
453
|
+
{ number: 4, tag: 'H4', nameKey: 'tools.header.heading4', name: 'Heading 4', icon: IconH4, styles: 'text-xl font-semibold mt-3 mb-px' },
|
|
454
|
+
{ number: 5, tag: 'H5', nameKey: 'tools.header.heading5', name: 'Heading 5', icon: IconH5, styles: 'text-base font-semibold mt-3 mb-px' },
|
|
455
|
+
{ number: 6, tag: 'H6', nameKey: 'tools.header.heading6', name: 'Heading 6', icon: IconH6, styles: 'text-sm font-semibold mt-3 mb-px' },
|
|
456
|
+
];
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Available header levels
|
|
460
|
+
*
|
|
461
|
+
* @returns Level array
|
|
462
|
+
*/
|
|
463
|
+
private get levels(): Level[] {
|
|
464
|
+
const overrides = this._settings.levelOverrides || {};
|
|
465
|
+
|
|
466
|
+
const availableLevels: Level[] = Header.DEFAULT_LEVELS.map(defaultLevel => {
|
|
467
|
+
const override = overrides[defaultLevel.number] || {};
|
|
468
|
+
|
|
469
|
+
// Build inline styles for custom overrides (dynamic values don't work with Tailwind)
|
|
470
|
+
const inlineStyles: Partial<CSSStyleDeclaration> = {};
|
|
471
|
+
|
|
472
|
+
if (override.size) {
|
|
473
|
+
inlineStyles.fontSize = override.size;
|
|
474
|
+
}
|
|
475
|
+
if (override.marginTop) {
|
|
476
|
+
inlineStyles.marginTop = override.marginTop;
|
|
477
|
+
}
|
|
478
|
+
if (override.marginBottom) {
|
|
479
|
+
inlineStyles.marginBottom = override.marginBottom;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
return {
|
|
483
|
+
number: defaultLevel.number,
|
|
484
|
+
tag: override.tag?.toUpperCase() || defaultLevel.tag,
|
|
485
|
+
nameKey: defaultLevel.nameKey,
|
|
486
|
+
name: override.name || defaultLevel.name,
|
|
487
|
+
icon: defaultLevel.icon,
|
|
488
|
+
styles: defaultLevel.styles,
|
|
489
|
+
inlineStyles,
|
|
490
|
+
};
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
return this._settings.levels
|
|
494
|
+
? availableLevels.filter(l => this._settings.levels!.includes(l.number))
|
|
495
|
+
: availableLevels;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Handle H1-H6 tags on paste to substitute it with header Tool
|
|
500
|
+
*
|
|
501
|
+
* @param event - event with pasted content
|
|
502
|
+
*/
|
|
503
|
+
public onPaste(event: PasteEvent): void {
|
|
504
|
+
const detail = event.detail;
|
|
505
|
+
|
|
506
|
+
if (!('data' in detail)) {
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
const content = detail.data as HTMLElement;
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
* Map tag names to level numbers
|
|
514
|
+
*/
|
|
515
|
+
const tagToLevel: Record<string, number> = {
|
|
516
|
+
H1: 1,
|
|
517
|
+
H2: 2,
|
|
518
|
+
H3: 3,
|
|
519
|
+
H4: 4,
|
|
520
|
+
H5: 5,
|
|
521
|
+
H6: 6,
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* Define default level value
|
|
526
|
+
*/
|
|
527
|
+
const parsedLevel = tagToLevel[content.tagName] ?? this.defaultLevel.number;
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* If levels are restricted, find the nearest allowed level
|
|
531
|
+
*/
|
|
532
|
+
const level = this._settings.levels
|
|
533
|
+
? this._settings.levels.reduce((prevLevel, currLevel) => {
|
|
534
|
+
return Math.abs(currLevel - parsedLevel) < Math.abs(prevLevel - parsedLevel) ? currLevel : prevLevel;
|
|
535
|
+
})
|
|
536
|
+
: parsedLevel;
|
|
537
|
+
|
|
538
|
+
this.data = {
|
|
539
|
+
level,
|
|
540
|
+
text: content.innerHTML,
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Used by Editor paste handling API.
|
|
546
|
+
* Provides configuration to handle H1-H6 tags.
|
|
547
|
+
*
|
|
548
|
+
* @returns PasteConfig
|
|
549
|
+
*/
|
|
550
|
+
public static get pasteConfig(): PasteConfig {
|
|
551
|
+
return {
|
|
552
|
+
tags: ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'],
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Get Tool toolbox settings
|
|
558
|
+
* icon - Tool icon's SVG
|
|
559
|
+
* title - title to show in toolbox
|
|
560
|
+
*
|
|
561
|
+
* @returns ToolboxConfig
|
|
562
|
+
*/
|
|
563
|
+
public static get toolbox(): ToolboxConfig {
|
|
564
|
+
return {
|
|
565
|
+
icon: IconHeading,
|
|
566
|
+
title: 'Heading',
|
|
567
|
+
titleKey: 'heading',
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module Tools
|
|
3
|
+
* Re-exports all built-in tools for easy importing.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* // Import specific tools
|
|
7
|
+
* import { Paragraph, Header, List, Bold, Italic, Link } from '@jackuait/blok/tools';
|
|
8
|
+
*
|
|
9
|
+
* // Use in Blok configuration
|
|
10
|
+
* new Blok({
|
|
11
|
+
* tools: { paragraph: Paragraph, header: Header, list: List },
|
|
12
|
+
* inlineTools: { bold: Bold, italic: Italic, link: Link }
|
|
13
|
+
* });
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// Block tools
|
|
17
|
+
export { Paragraph } from './paragraph';
|
|
18
|
+
export { Header } from './header';
|
|
19
|
+
export { ListItem as List } from './list';
|
|
20
|
+
|
|
21
|
+
// Inline tools
|
|
22
|
+
export { BoldInlineTool as Bold } from '../components/inline-tools/inline-tool-bold';
|
|
23
|
+
export { ItalicInlineTool as Italic } from '../components/inline-tools/inline-tool-italic';
|
|
24
|
+
export { LinkInlineTool as Link } from '../components/inline-tools/inline-tool-link';
|
|
25
|
+
export { ConvertInlineTool as Convert } from '../components/inline-tools/inline-tool-convert';
|
|
26
|
+
|
|
27
|
+
// Default tools configuration for convenience
|
|
28
|
+
export const defaultBlockTools = {
|
|
29
|
+
paragraph: { inlineToolbar: true, config: { preserveBlank: true } },
|
|
30
|
+
header: { inlineToolbar: true },
|
|
31
|
+
list: { inlineToolbar: true },
|
|
32
|
+
} as const;
|
|
33
|
+
|
|
34
|
+
export const defaultInlineTools = {
|
|
35
|
+
bold: {},
|
|
36
|
+
italic: {},
|
|
37
|
+
link: {},
|
|
38
|
+
} as const;
|