@jackuait/blok 0.4.1 → 0.4.2
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 +16 -0
- package/codemod/migrate-editorjs-to-blok.js +859 -92
- package/codemod/test.js +682 -77
- package/dist/blok.mjs +5 -2
- package/dist/chunks/blok-BjgH1REI.mjs +12838 -0
- package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
- package/dist/chunks/i18next-loader-DfiUa_gd.mjs +43 -0
- package/dist/{index-CBkApZKo.mjs → chunks/index-5m5JWNey.mjs} +2 -2
- package/dist/chunks/inline-tool-convert-Bx5BVd8I.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 +47 -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,448 @@
|
|
|
1
|
+
import type { PopoverItem, PopoverItemRenderParamsMap } from './components/popover-item';
|
|
2
|
+
import { PopoverItemDefault, PopoverItemSeparator, PopoverItemType } from './components/popover-item';
|
|
3
|
+
import type { SearchInput } from './components/search-input';
|
|
4
|
+
import { EventsDispatcher } from '../events';
|
|
5
|
+
import { Listeners } from '../listeners';
|
|
6
|
+
import type { PopoverEventMap, PopoverMessages, PopoverParams, PopoverNodes } from '@/types/utils/popover/popover';
|
|
7
|
+
import { PopoverEvent } from '@/types/utils/popover/popover-event';
|
|
8
|
+
import type { PopoverItemParams } from './components/popover-item';
|
|
9
|
+
import { PopoverItemHtml } from './components/popover-item/popover-item-html/popover-item-html';
|
|
10
|
+
import { css } from './popover.const';
|
|
11
|
+
import { DATA_ATTR } from '../../constants/data-attributes';
|
|
12
|
+
import { twMerge } from '../tw';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Class responsible for rendering popover and handling its behaviour.
|
|
16
|
+
* Uses vanilla DOM manipulation for rendering.
|
|
17
|
+
*/
|
|
18
|
+
export abstract class PopoverAbstract<Nodes extends PopoverNodes = PopoverNodes> extends EventsDispatcher<PopoverEventMap> {
|
|
19
|
+
/**
|
|
20
|
+
* List of popover items
|
|
21
|
+
*/
|
|
22
|
+
protected items: Array<PopoverItem>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Listeners util instance
|
|
26
|
+
*/
|
|
27
|
+
protected listeners: Listeners = new Listeners();
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Refs to created HTML elements.
|
|
31
|
+
*/
|
|
32
|
+
protected nodes: Nodes;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* List of default popover items that are searchable and may have confirmation state
|
|
36
|
+
*/
|
|
37
|
+
protected get itemsDefault(): PopoverItemDefault[] {
|
|
38
|
+
return this.items.filter(item => item instanceof PopoverItemDefault) as PopoverItemDefault[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Instance of the Search Input
|
|
43
|
+
*/
|
|
44
|
+
protected search: SearchInput | undefined;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Messages that will be displayed in popover
|
|
48
|
+
*/
|
|
49
|
+
protected messages: PopoverMessages = {
|
|
50
|
+
nothingFound: 'Nothing found',
|
|
51
|
+
search: 'Search',
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Constructs the instance
|
|
56
|
+
* @param params - popover construction params
|
|
57
|
+
* @param itemsRenderParams - popover item render params.
|
|
58
|
+
* The parameters that are not set by user via popover api but rather depend on technical implementation
|
|
59
|
+
*/
|
|
60
|
+
constructor(
|
|
61
|
+
protected readonly params: PopoverParams,
|
|
62
|
+
protected readonly itemsRenderParams: PopoverItemRenderParamsMap = {}
|
|
63
|
+
) {
|
|
64
|
+
super();
|
|
65
|
+
|
|
66
|
+
this.items = this.buildItems(params.items);
|
|
67
|
+
|
|
68
|
+
if (params.messages) {
|
|
69
|
+
this.messages = {
|
|
70
|
+
...this.messages,
|
|
71
|
+
...params.messages,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Initialize nodes object and create DOM elements
|
|
76
|
+
this.nodes = this.createPopoverDOM() as Nodes;
|
|
77
|
+
|
|
78
|
+
// Append item elements to the items container
|
|
79
|
+
this.appendItemElements();
|
|
80
|
+
|
|
81
|
+
// Set up click listener on the container
|
|
82
|
+
if (this.nodes.popoverContainer) {
|
|
83
|
+
this.listeners.on(this.nodes.popoverContainer, 'click', (event: Event) => this.handleClick(event));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Returns HTML element corresponding to the popover
|
|
89
|
+
*/
|
|
90
|
+
public getElement(): HTMLElement {
|
|
91
|
+
return this.nodes.popover as HTMLElement;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Returns DOM element that should be attached to the document.
|
|
96
|
+
*/
|
|
97
|
+
public getMountElement(): HTMLElement {
|
|
98
|
+
return this.nodes.popover as HTMLElement;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Open popover
|
|
103
|
+
*/
|
|
104
|
+
public show(): void {
|
|
105
|
+
const mountTarget = this.nodes.popover;
|
|
106
|
+
|
|
107
|
+
if (mountTarget !== null && !mountTarget.isConnected) {
|
|
108
|
+
document.body.appendChild(mountTarget);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Update DOM state
|
|
112
|
+
this.nodes.popover.setAttribute(DATA_ATTR.popoverOpened, 'true');
|
|
113
|
+
this.nodes.popoverContainer.classList.add(...css.popoverContainerOpened.split(' '));
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Refresh active states for all items.
|
|
117
|
+
* This ensures items with dynamic isActive() callbacks reflect the current state.
|
|
118
|
+
*/
|
|
119
|
+
this.itemsDefault.forEach(item => this.refreshItemActiveState(item));
|
|
120
|
+
|
|
121
|
+
if (this.search !== undefined) {
|
|
122
|
+
this.search.focus();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Closes popover
|
|
128
|
+
*/
|
|
129
|
+
public hide(): void {
|
|
130
|
+
// Update DOM state
|
|
131
|
+
this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpened);
|
|
132
|
+
this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenTop);
|
|
133
|
+
this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenLeft);
|
|
134
|
+
this.nodes.popoverContainer.classList.remove(...css.popoverContainerOpened.split(' '));
|
|
135
|
+
|
|
136
|
+
this.itemsDefault.forEach(item => item.reset());
|
|
137
|
+
|
|
138
|
+
if (this.search !== undefined) {
|
|
139
|
+
this.search.clear();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
this.emit(PopoverEvent.Closed);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Clears memory
|
|
147
|
+
*/
|
|
148
|
+
public destroy(): void {
|
|
149
|
+
this.items.forEach(item => item.destroy());
|
|
150
|
+
this.nodes.popover?.remove();
|
|
151
|
+
this.listeners.removeAll();
|
|
152
|
+
this.search?.destroy();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Looks for the item by name and imitates click on it
|
|
157
|
+
* @param name - name of the item to activate
|
|
158
|
+
*/
|
|
159
|
+
public activateItemByName(name: string): void {
|
|
160
|
+
const foundItem = this.items.find(item => item.name === name);
|
|
161
|
+
|
|
162
|
+
if (foundItem === undefined) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
this.handleItemClick(foundItem);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Factory method for creating popover items
|
|
171
|
+
* @param items - list of items params
|
|
172
|
+
*/
|
|
173
|
+
protected buildItems(items: PopoverItemParams[]): Array<PopoverItem> {
|
|
174
|
+
return items.map(item => {
|
|
175
|
+
switch (item.type) {
|
|
176
|
+
case PopoverItemType.Separator:
|
|
177
|
+
return new PopoverItemSeparator(this.itemsRenderParams[PopoverItemType.Separator]);
|
|
178
|
+
case PopoverItemType.Html:
|
|
179
|
+
return new PopoverItemHtml(item, this.itemsRenderParams[PopoverItemType.Html]);
|
|
180
|
+
default:
|
|
181
|
+
return new PopoverItemDefault(item, this.itemsRenderParams[PopoverItemType.Default]);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Retrieves popover item that is the target of the specified event
|
|
188
|
+
* @param event - event to retrieve popover item from
|
|
189
|
+
*/
|
|
190
|
+
protected getTargetItem(event: Event): PopoverItemDefault | PopoverItemHtml | undefined {
|
|
191
|
+
return this.items
|
|
192
|
+
.filter(item => item instanceof PopoverItemDefault || item instanceof PopoverItemHtml)
|
|
193
|
+
.find(item => {
|
|
194
|
+
const itemEl = item.getElement();
|
|
195
|
+
|
|
196
|
+
if (itemEl === null) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return event.composedPath().includes(itemEl);
|
|
201
|
+
}) as PopoverItemDefault | PopoverItemHtml | undefined;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Handles popover item click
|
|
206
|
+
* @param item - item to handle click of
|
|
207
|
+
*/
|
|
208
|
+
protected handleItemClick(item: PopoverItem): void {
|
|
209
|
+
if (item instanceof PopoverItemDefault && item.isDisabled) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (item.hasChildren) {
|
|
214
|
+
this.showNestedItems(item as PopoverItemDefault | PopoverItemHtml);
|
|
215
|
+
this.callHandleClickIfPresent(item);
|
|
216
|
+
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Cleanup other items state */
|
|
221
|
+
this.itemsDefault.filter(x => x !== item).forEach(x => x.reset());
|
|
222
|
+
|
|
223
|
+
this.callHandleClickIfPresent(item);
|
|
224
|
+
|
|
225
|
+
this.toggleItemActivenessIfNeeded(item);
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Refresh item's active state based on isActive() callback.
|
|
229
|
+
* This is needed for inline tools that dynamically determine their active state.
|
|
230
|
+
*/
|
|
231
|
+
this.refreshItemActiveState(item);
|
|
232
|
+
|
|
233
|
+
if (item.closeOnActivate === true) {
|
|
234
|
+
this.hide();
|
|
235
|
+
|
|
236
|
+
this.emit(PopoverEvent.ClosedOnActivate);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Handles clicks inside popover
|
|
242
|
+
* @param event - item to handle click of
|
|
243
|
+
*/
|
|
244
|
+
private handleClick(event: Event): void {
|
|
245
|
+
const item = this.getTargetItem(event);
|
|
246
|
+
|
|
247
|
+
if (item === undefined) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
this.handleItemClick(item);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* - Toggles item active state, if clicked popover item has property 'toggle' set to true.
|
|
257
|
+
*
|
|
258
|
+
* - Performs radiobutton-like behavior if the item has property 'toggle' set to string key.
|
|
259
|
+
* (All the other items with the same key get inactive, and the item gets active)
|
|
260
|
+
* @param clickedItem - popover item that was clicked
|
|
261
|
+
*/
|
|
262
|
+
private toggleItemActivenessIfNeeded(clickedItem: PopoverItem): void {
|
|
263
|
+
if (!(clickedItem instanceof PopoverItemDefault)) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (clickedItem.toggle === true) {
|
|
268
|
+
clickedItem.toggleActive();
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (typeof clickedItem.toggle !== 'string') {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const itemsInToggleGroup = this.itemsDefault.filter(item => item.toggle === clickedItem.toggle);
|
|
276
|
+
|
|
277
|
+
/** If there's only one item in toggle group, toggle it */
|
|
278
|
+
if (itemsInToggleGroup.length === 1) {
|
|
279
|
+
clickedItem.toggleActive();
|
|
280
|
+
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** Set clicked item as active and the rest items with same toggle key value as inactive */
|
|
285
|
+
itemsInToggleGroup.forEach(item => {
|
|
286
|
+
item.toggleActive(item === clickedItem);
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Refreshes the item's active state based on its isActive callback.
|
|
292
|
+
* This is useful for items that determine their active state dynamically (e.g., inline tools).
|
|
293
|
+
* @param item - popover item to refresh
|
|
294
|
+
*/
|
|
295
|
+
private refreshItemActiveState(item: PopoverItem): void {
|
|
296
|
+
if (!(item instanceof PopoverItemDefault)) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Only refresh if the item doesn't use toggle (which is handled by toggleItemActivenessIfNeeded)
|
|
302
|
+
*/
|
|
303
|
+
if (item.toggle !== undefined) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Update the visual state based on the isActive callback
|
|
309
|
+
*/
|
|
310
|
+
item.toggleActive(item.isActive);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Executes handleClick if it is present on item.
|
|
315
|
+
* @param item - popover item whose handler should be executed
|
|
316
|
+
*/
|
|
317
|
+
private callHandleClickIfPresent(item: PopoverItem): void {
|
|
318
|
+
if ('handleClick' in item && typeof item.handleClick === 'function') {
|
|
319
|
+
item.handleClick();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Handles displaying nested items for the item. Behaviour differs depending on platform.
|
|
325
|
+
* @param item – item to show nested popover for
|
|
326
|
+
*/
|
|
327
|
+
protected abstract showNestedItems(item: PopoverItemDefault | PopoverItemHtml): void;
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Toggles nothing found message visibility
|
|
331
|
+
* @param isDisplayed - true if the message should be displayed
|
|
332
|
+
*/
|
|
333
|
+
protected toggleNothingFoundMessage(isDisplayed: boolean): void {
|
|
334
|
+
if (isDisplayed) {
|
|
335
|
+
this.nodes.nothingFoundMessage.classList.remove('hidden');
|
|
336
|
+
this.nodes.nothingFoundMessage.setAttribute(DATA_ATTR.nothingFoundDisplayed, 'true');
|
|
337
|
+
} else {
|
|
338
|
+
this.nodes.nothingFoundMessage.classList.add('hidden');
|
|
339
|
+
this.nodes.nothingFoundMessage.removeAttribute(DATA_ATTR.nothingFoundDisplayed);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Sets the open-top state for the popover
|
|
345
|
+
* @param openTop - true if popover should open above trigger
|
|
346
|
+
*/
|
|
347
|
+
protected setOpenTop(openTop: boolean): void {
|
|
348
|
+
if (openTop) {
|
|
349
|
+
this.nodes.popover.setAttribute(DATA_ATTR.popoverOpenTop, 'true');
|
|
350
|
+
} else {
|
|
351
|
+
this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenTop);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Sets the open-left state for the popover
|
|
357
|
+
* @param openLeft - true if popover should open to the left
|
|
358
|
+
*/
|
|
359
|
+
protected setOpenLeft(openLeft: boolean): void {
|
|
360
|
+
if (openLeft) {
|
|
361
|
+
this.nodes.popover.setAttribute(DATA_ATTR.popoverOpenLeft, 'true');
|
|
362
|
+
} else {
|
|
363
|
+
this.nodes.popover.removeAttribute(DATA_ATTR.popoverOpenLeft);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Checks if popover contains the node
|
|
369
|
+
* @param node - node to check
|
|
370
|
+
*/
|
|
371
|
+
public hasNode(node: Node): boolean {
|
|
372
|
+
return this.nodes.popover.contains(node);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Creates the popover DOM structure
|
|
377
|
+
* @returns PopoverNodes object with all required elements
|
|
378
|
+
*/
|
|
379
|
+
private createPopoverDOM(): PopoverNodes {
|
|
380
|
+
// Create root popover element
|
|
381
|
+
const popover = document.createElement('div');
|
|
382
|
+
|
|
383
|
+
if (this.params.class) {
|
|
384
|
+
popover.className = this.params.class;
|
|
385
|
+
}
|
|
386
|
+
popover.setAttribute(DATA_ATTR.popover, '');
|
|
387
|
+
if (this.params.class) {
|
|
388
|
+
popover.setAttribute('data-blok-popover-custom-class', this.params.class);
|
|
389
|
+
}
|
|
390
|
+
popover.setAttribute('data-blok-testid', 'popover');
|
|
391
|
+
|
|
392
|
+
// Set CSS variables
|
|
393
|
+
popover.style.setProperty('--width', '200px');
|
|
394
|
+
popover.style.setProperty('--item-padding', '3px');
|
|
395
|
+
popover.style.setProperty('--item-height', 'calc(1.25rem + 2 * var(--item-padding))');
|
|
396
|
+
popover.style.setProperty('--popover-top', 'calc(100% + 0.5rem)');
|
|
397
|
+
popover.style.setProperty('--popover-left', '0');
|
|
398
|
+
popover.style.setProperty('--nested-popover-overlap', '0.25rem');
|
|
399
|
+
|
|
400
|
+
// Create popover container
|
|
401
|
+
const popoverContainer = document.createElement('div');
|
|
402
|
+
popoverContainer.className = css.popoverContainer;
|
|
403
|
+
popoverContainer.setAttribute(DATA_ATTR.popoverContainer, '');
|
|
404
|
+
popoverContainer.setAttribute('data-blok-testid', 'popover-container');
|
|
405
|
+
|
|
406
|
+
// Create nothing found message
|
|
407
|
+
const nothingFoundMessage = document.createElement('div');
|
|
408
|
+
nothingFoundMessage.className = twMerge(
|
|
409
|
+
'cursor-default text-sm leading-5 font-medium whitespace-nowrap overflow-hidden text-ellipsis text-gray-text p-[3px]',
|
|
410
|
+
'hidden'
|
|
411
|
+
);
|
|
412
|
+
nothingFoundMessage.setAttribute('data-blok-testid', 'popover-nothing-found');
|
|
413
|
+
nothingFoundMessage.textContent = this.messages.nothingFound ?? 'Nothing found';
|
|
414
|
+
|
|
415
|
+
// Create items container
|
|
416
|
+
const items = document.createElement('div');
|
|
417
|
+
items.className = css.items;
|
|
418
|
+
items.setAttribute(DATA_ATTR.popoverItems, '');
|
|
419
|
+
items.setAttribute('data-blok-testid', 'popover-items');
|
|
420
|
+
|
|
421
|
+
// Assemble DOM structure
|
|
422
|
+
popoverContainer.appendChild(nothingFoundMessage);
|
|
423
|
+
popoverContainer.appendChild(items);
|
|
424
|
+
popover.appendChild(popoverContainer);
|
|
425
|
+
|
|
426
|
+
return {
|
|
427
|
+
popover,
|
|
428
|
+
popoverContainer,
|
|
429
|
+
nothingFoundMessage,
|
|
430
|
+
items,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Appends item elements to the items container
|
|
436
|
+
*/
|
|
437
|
+
private appendItemElements(): void {
|
|
438
|
+
this.items.forEach(item => {
|
|
439
|
+
const itemEl = item.getMountElement?.() ?? item.getElement();
|
|
440
|
+
|
|
441
|
+
if (itemEl === null) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
this.nodes.items?.appendChild(itemEl);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
}
|