@jackuait/blok 0.4.1-beta.5 → 0.4.1-beta.6
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 +868 -92
- package/codemod/test.js +682 -77
- package/dist/blok.mjs +5 -2
- package/dist/chunks/blok-B5qs7C5l.mjs +12838 -0
- package/dist/chunks/i18next-CugVlwWp.mjs +1292 -0
- package/dist/chunks/i18next-loader-CTrK3HzG.mjs +43 -0
- package/dist/{index-Cl_5rkKS.mjs → chunks/index-DDpzQn-0.mjs} +2 -2
- package/dist/chunks/inline-tool-convert-RBcopmCh.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 +48 -16
- 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 -12
- 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/header.d.ts +18 -0
- package/types/tools/index.d.ts +1 -0
- package/types/tools/list.d.ts +91 -0
- package/types/tools/paragraph.d.ts +71 -0
- package/types/tools/tool-settings.d.ts +16 -2
- 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-DvN73wsH.mjs +0 -19922
- package/dist/blok.umd.js +0 -166
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EditorModes.stories.ts - Stories for different editor operational modes.
|
|
3
|
+
*
|
|
4
|
+
* This file is the canonical location for:
|
|
5
|
+
* - ReadOnlyMode: Editor in read-only state
|
|
6
|
+
* - EmptyEditor: Editor with no initial content
|
|
7
|
+
* - ToolboxOpenedMode: Editor with toolbox popover open
|
|
8
|
+
* - NarrowMode: Editor in constrained width container
|
|
9
|
+
*
|
|
10
|
+
* Do not duplicate these stories in other files.
|
|
11
|
+
*/
|
|
12
|
+
import type { Meta, StoryObj } from '@storybook/html-vite';
|
|
13
|
+
import { waitFor, expect } from 'storybook/test';
|
|
14
|
+
import type { OutputData, API } from '@/types';
|
|
15
|
+
import { createEditorContainer, simulateClick, waitForToolbar, TOOLBAR_TESTID } from './helpers';
|
|
16
|
+
import type { EditorFactoryOptions, EditorContainer } from './helpers';
|
|
17
|
+
|
|
18
|
+
interface EditorModesArgs extends EditorFactoryOptions {
|
|
19
|
+
minHeight: number;
|
|
20
|
+
width: number;
|
|
21
|
+
data: OutputData | undefined;
|
|
22
|
+
readOnly: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Constants
|
|
26
|
+
const BLOCK_TESTID = '[data-blok-testid="block-wrapper"]';
|
|
27
|
+
const ACTIONS_TESTID = '[data-blok-testid="toolbar-actions"]';
|
|
28
|
+
const PLUS_BUTTON_TESTID = '[data-blok-testid="plus-button"]';
|
|
29
|
+
const TOOLBOX_OPENED_SELECTOR = '[data-blok-toolbox-opened="true"]';
|
|
30
|
+
|
|
31
|
+
const TIMEOUT_INIT = { timeout: 5000 };
|
|
32
|
+
const TIMEOUT_ACTION = { timeout: 5000 };
|
|
33
|
+
|
|
34
|
+
const sampleData: OutputData = {
|
|
35
|
+
time: Date.now(),
|
|
36
|
+
version: '1.0.0',
|
|
37
|
+
blocks: [
|
|
38
|
+
{
|
|
39
|
+
id: 'mode-block-1',
|
|
40
|
+
type: 'paragraph',
|
|
41
|
+
data: { text: 'First paragraph for testing editor modes.' },
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'mode-block-2',
|
|
45
|
+
type: 'paragraph',
|
|
46
|
+
data: { text: 'Second paragraph with more content.' },
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'mode-block-3',
|
|
50
|
+
type: 'paragraph',
|
|
51
|
+
data: { text: 'Third paragraph block.' },
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const createEditor = (args: EditorModesArgs): HTMLElement => createEditorContainer(args);
|
|
57
|
+
|
|
58
|
+
const meta: Meta<EditorModesArgs> = {
|
|
59
|
+
title: 'Editor/Modes',
|
|
60
|
+
tags: ['autodocs'],
|
|
61
|
+
args: {
|
|
62
|
+
minHeight: 300,
|
|
63
|
+
width: 0,
|
|
64
|
+
data: sampleData,
|
|
65
|
+
readOnly: false,
|
|
66
|
+
},
|
|
67
|
+
render: createEditor,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export default meta;
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
type Story = StoryObj<EditorModesArgs>;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Read-only mode - content cannot be edited.
|
|
77
|
+
*/
|
|
78
|
+
export const ReadOnlyMode: Story = {
|
|
79
|
+
args: {
|
|
80
|
+
data: sampleData,
|
|
81
|
+
readOnly: true,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Narrow mode - editor in a constrained width container.
|
|
87
|
+
* Toolbar actions move inside the content area.
|
|
88
|
+
*/
|
|
89
|
+
export const NarrowMode: Story = {
|
|
90
|
+
args: {
|
|
91
|
+
data: sampleData,
|
|
92
|
+
readOnly: false,
|
|
93
|
+
width: 400,
|
|
94
|
+
},
|
|
95
|
+
play: async ({ canvasElement, step }) => {
|
|
96
|
+
await step('Wait for editor and toolbar to initialize', async () => {
|
|
97
|
+
await waitFor(
|
|
98
|
+
() => {
|
|
99
|
+
const block = canvasElement.querySelector(BLOCK_TESTID);
|
|
100
|
+
|
|
101
|
+
expect(block).toBeInTheDocument();
|
|
102
|
+
},
|
|
103
|
+
TIMEOUT_INIT
|
|
104
|
+
);
|
|
105
|
+
// Wait for toolbar to be created (happens in requestIdleCallback)
|
|
106
|
+
await waitForToolbar(canvasElement);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
await step('Click block to show toolbar in narrow mode', async () => {
|
|
110
|
+
const block = canvasElement.querySelector(BLOCK_TESTID);
|
|
111
|
+
|
|
112
|
+
if (block) {
|
|
113
|
+
simulateClick(block);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
await waitFor(
|
|
117
|
+
() => {
|
|
118
|
+
const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
|
|
119
|
+
|
|
120
|
+
expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
|
|
121
|
+
},
|
|
122
|
+
TIMEOUT_ACTION
|
|
123
|
+
);
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Empty editor state - no blocks.
|
|
130
|
+
*/
|
|
131
|
+
export const EmptyEditor: Story = {
|
|
132
|
+
args: {
|
|
133
|
+
data: undefined,
|
|
134
|
+
readOnly: false,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Editor with many blocks (scrolling behavior).
|
|
140
|
+
*/
|
|
141
|
+
export const ManyBlocks: Story = {
|
|
142
|
+
args: {
|
|
143
|
+
data: {
|
|
144
|
+
time: Date.now(),
|
|
145
|
+
version: '1.0.0',
|
|
146
|
+
blocks: Array.from({ length: 15 }, (_, i) => ({
|
|
147
|
+
id: `many-block-${i + 1}`,
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
data: { text: `Paragraph block number ${i + 1}. Lorem ipsum dolor sit amet, consectetur adipiscing elit.` },
|
|
150
|
+
})),
|
|
151
|
+
},
|
|
152
|
+
readOnly: false,
|
|
153
|
+
minHeight: 400,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Editor focused state with toolbar visible.
|
|
159
|
+
*/
|
|
160
|
+
export const FocusedWithToolbar: Story = {
|
|
161
|
+
args: {
|
|
162
|
+
data: sampleData,
|
|
163
|
+
readOnly: false,
|
|
164
|
+
},
|
|
165
|
+
play: async ({ canvasElement, step }) => {
|
|
166
|
+
await step('Wait for editor and toolbar to initialize', async () => {
|
|
167
|
+
await waitFor(
|
|
168
|
+
() => {
|
|
169
|
+
const block = canvasElement.querySelector(BLOCK_TESTID);
|
|
170
|
+
|
|
171
|
+
expect(block).toBeInTheDocument();
|
|
172
|
+
},
|
|
173
|
+
TIMEOUT_INIT
|
|
174
|
+
);
|
|
175
|
+
// Wait for toolbar to be created (happens in requestIdleCallback)
|
|
176
|
+
await waitForToolbar(canvasElement);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
await step('Focus block to show toolbar', async () => {
|
|
180
|
+
const block = canvasElement.querySelector(BLOCK_TESTID);
|
|
181
|
+
|
|
182
|
+
if (block) {
|
|
183
|
+
simulateClick(block);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
await waitFor(
|
|
187
|
+
() => {
|
|
188
|
+
const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
|
|
189
|
+
|
|
190
|
+
expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
|
|
191
|
+
|
|
192
|
+
const actionsZone = canvasElement.querySelector(ACTIONS_TESTID);
|
|
193
|
+
|
|
194
|
+
expect(actionsZone).toBeInTheDocument();
|
|
195
|
+
},
|
|
196
|
+
TIMEOUT_ACTION
|
|
197
|
+
);
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Toolbox opened state (special editor class).
|
|
204
|
+
*/
|
|
205
|
+
export const ToolboxOpenedMode: Story = {
|
|
206
|
+
args: {
|
|
207
|
+
data: sampleData,
|
|
208
|
+
readOnly: false,
|
|
209
|
+
},
|
|
210
|
+
play: async ({ canvasElement, step }) => {
|
|
211
|
+
await step('Wait for editor and toolbar to initialize', async () => {
|
|
212
|
+
await waitFor(
|
|
213
|
+
() => {
|
|
214
|
+
const block = canvasElement.querySelector(BLOCK_TESTID);
|
|
215
|
+
|
|
216
|
+
expect(block).toBeInTheDocument();
|
|
217
|
+
},
|
|
218
|
+
TIMEOUT_INIT
|
|
219
|
+
);
|
|
220
|
+
// Wait for toolbar to be created (happens in requestIdleCallback)
|
|
221
|
+
await waitForToolbar(canvasElement);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
await step('Focus block', async () => {
|
|
225
|
+
const block = canvasElement.querySelector(BLOCK_TESTID);
|
|
226
|
+
|
|
227
|
+
if (block) {
|
|
228
|
+
simulateClick(block);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
await waitFor(
|
|
232
|
+
() => {
|
|
233
|
+
const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
|
|
234
|
+
|
|
235
|
+
expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
|
|
236
|
+
},
|
|
237
|
+
TIMEOUT_ACTION
|
|
238
|
+
);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
await step('Open toolbox', async () => {
|
|
242
|
+
const plusButton = canvasElement.querySelector(PLUS_BUTTON_TESTID);
|
|
243
|
+
|
|
244
|
+
if (plusButton) {
|
|
245
|
+
simulateClick(plusButton);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
await waitFor(
|
|
249
|
+
() => {
|
|
250
|
+
const editor = canvasElement.querySelector(TOOLBOX_OPENED_SELECTOR);
|
|
251
|
+
|
|
252
|
+
expect(editor).toBeInTheDocument();
|
|
253
|
+
},
|
|
254
|
+
TIMEOUT_ACTION
|
|
255
|
+
);
|
|
256
|
+
});
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Compact narrow editor (mobile-like).
|
|
262
|
+
*/
|
|
263
|
+
export const CompactNarrow: Story = {
|
|
264
|
+
args: {
|
|
265
|
+
data: sampleData,
|
|
266
|
+
readOnly: false,
|
|
267
|
+
width: 320,
|
|
268
|
+
minHeight: 200,
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* RTL (Right-to-Left) mode for languages like Arabic and Hebrew.
|
|
274
|
+
* Text direction and toolbar positioning are mirrored.
|
|
275
|
+
*/
|
|
276
|
+
export const RTLMode: Story = {
|
|
277
|
+
args: {
|
|
278
|
+
data: {
|
|
279
|
+
time: Date.now(),
|
|
280
|
+
version: '1.0.0',
|
|
281
|
+
blocks: [
|
|
282
|
+
{
|
|
283
|
+
id: 'rtl-block-1',
|
|
284
|
+
type: 'paragraph',
|
|
285
|
+
data: { text: 'هذا نص باللغة العربية لاختبار وضع RTL.' },
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
id: 'rtl-block-2',
|
|
289
|
+
type: 'paragraph',
|
|
290
|
+
data: { text: 'النص يتدفق من اليمين إلى اليسار.' },
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
id: 'rtl-block-3',
|
|
294
|
+
type: 'paragraph',
|
|
295
|
+
data: { text: 'شريط الأدوات والعناصر التحكم معكوسة.' },
|
|
296
|
+
},
|
|
297
|
+
],
|
|
298
|
+
},
|
|
299
|
+
readOnly: false,
|
|
300
|
+
i18n: {
|
|
301
|
+
direction: 'rtl',
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
play: async ({ canvasElement, step }) => {
|
|
305
|
+
await step('Verify RTL direction is applied', async () => {
|
|
306
|
+
await waitFor(
|
|
307
|
+
() => {
|
|
308
|
+
const rtlEditor = canvasElement.querySelector('[data-blok-testid="blok-editor"][data-blok-rtl="true"]');
|
|
309
|
+
|
|
310
|
+
expect(rtlEditor).toBeTruthy();
|
|
311
|
+
},
|
|
312
|
+
TIMEOUT_INIT
|
|
313
|
+
);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
await step('Show toolbar in RTL mode', async () => {
|
|
317
|
+
await waitForToolbar(canvasElement);
|
|
318
|
+
|
|
319
|
+
const block = canvasElement.querySelector(BLOCK_TESTID);
|
|
320
|
+
|
|
321
|
+
if (block) {
|
|
322
|
+
simulateClick(block);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
await waitFor(
|
|
326
|
+
() => {
|
|
327
|
+
const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
|
|
328
|
+
|
|
329
|
+
expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
|
|
330
|
+
},
|
|
331
|
+
TIMEOUT_ACTION
|
|
332
|
+
);
|
|
333
|
+
});
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Dragging state - visual feedback when a block is being dragged.
|
|
339
|
+
* Shows grabbing cursor across the editor and demonstrates block reordering.
|
|
340
|
+
*/
|
|
341
|
+
export const DraggingState: Story = {
|
|
342
|
+
args: {
|
|
343
|
+
data: sampleData,
|
|
344
|
+
readOnly: false,
|
|
345
|
+
},
|
|
346
|
+
play: async ({ canvasElement, step }) => {
|
|
347
|
+
const container = canvasElement.querySelector('[data-story-container]') as EditorContainer | null;
|
|
348
|
+
|
|
349
|
+
await step('Wait for editor and toolbar to initialize', async () => {
|
|
350
|
+
await waitFor(
|
|
351
|
+
() => {
|
|
352
|
+
const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
|
|
353
|
+
|
|
354
|
+
expect(blocks.length).toBeGreaterThanOrEqual(3);
|
|
355
|
+
// Also wait for editor instance to be available
|
|
356
|
+
expect(container?.__blokEditor).toBeTruthy();
|
|
357
|
+
},
|
|
358
|
+
TIMEOUT_INIT
|
|
359
|
+
);
|
|
360
|
+
await waitForToolbar(canvasElement);
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
await step('Focus block to show toolbar with drag handle', async () => {
|
|
364
|
+
const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
|
|
365
|
+
const firstBlock = blocks[0];
|
|
366
|
+
|
|
367
|
+
if (firstBlock) {
|
|
368
|
+
simulateClick(firstBlock);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
await waitFor(
|
|
372
|
+
() => {
|
|
373
|
+
const toolbar = canvasElement.querySelector(TOOLBAR_TESTID);
|
|
374
|
+
|
|
375
|
+
expect(toolbar).toHaveAttribute('data-blok-opened', 'true');
|
|
376
|
+
},
|
|
377
|
+
TIMEOUT_ACTION
|
|
378
|
+
);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
await step('Add dragging state to show visual dragging state', async () => {
|
|
382
|
+
const editorWrapper = canvasElement.querySelector('[data-blok-testid="blok-editor"]');
|
|
383
|
+
|
|
384
|
+
if (editorWrapper) {
|
|
385
|
+
editorWrapper.setAttribute('data-blok-dragging', 'true');
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
await waitFor(
|
|
389
|
+
() => {
|
|
390
|
+
const draggingEditor = canvasElement.querySelector('[data-blok-testid="blok-editor"][data-blok-dragging="true"]');
|
|
391
|
+
|
|
392
|
+
expect(draggingEditor).toBeTruthy();
|
|
393
|
+
},
|
|
394
|
+
TIMEOUT_ACTION
|
|
395
|
+
);
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
await step('Move first block to third position using editor API', async () => {
|
|
399
|
+
const editor = container?.__blokEditor;
|
|
400
|
+
|
|
401
|
+
if (editor) {
|
|
402
|
+
// Move block from index 0 to index 2 (after the current third block)
|
|
403
|
+
// Cast to access the dynamically added blocks API
|
|
404
|
+
(editor as unknown as { blocks: API['blocks'] }).blocks.move(2, 0);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Wait a moment for the DOM to update
|
|
408
|
+
await new Promise(resolve => setTimeout(resolve, 300));
|
|
409
|
+
|
|
410
|
+
// Verify the blocks have been reordered
|
|
411
|
+
await waitFor(
|
|
412
|
+
() => {
|
|
413
|
+
const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
|
|
414
|
+
// First block should now contain "Second paragraph" text
|
|
415
|
+
const firstBlockText = blocks[0]?.textContent ?? '';
|
|
416
|
+
|
|
417
|
+
expect(firstBlockText).toContain('Second');
|
|
418
|
+
},
|
|
419
|
+
TIMEOUT_ACTION
|
|
420
|
+
);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
await step('Remove dragging state after move completes', async () => {
|
|
424
|
+
// Keep dragging state visible for a moment to show the state
|
|
425
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
426
|
+
|
|
427
|
+
const editorWrapper = canvasElement.querySelector('[data-blok-testid="blok-editor"]');
|
|
428
|
+
|
|
429
|
+
if (editorWrapper) {
|
|
430
|
+
editorWrapper.removeAttribute('data-blok-dragging');
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Rectangle selection overlay - visual feedback when selecting multiple blocks with mouse drag.
|
|
438
|
+
*/
|
|
439
|
+
export const RectangleSelection: Story = {
|
|
440
|
+
args: {
|
|
441
|
+
data: sampleData,
|
|
442
|
+
readOnly: false,
|
|
443
|
+
},
|
|
444
|
+
play: async ({ canvasElement, step }) => {
|
|
445
|
+
await step('Wait for editor to initialize', async () => {
|
|
446
|
+
await waitFor(
|
|
447
|
+
() => {
|
|
448
|
+
const blocks = canvasElement.querySelectorAll(BLOCK_TESTID);
|
|
449
|
+
|
|
450
|
+
expect(blocks.length).toBeGreaterThan(0);
|
|
451
|
+
},
|
|
452
|
+
TIMEOUT_INIT
|
|
453
|
+
);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
await step('Create and show rectangle selection overlay', async () => {
|
|
457
|
+
// Create the overlay structure manually for visual demonstration
|
|
458
|
+
const editorWrapper = canvasElement.querySelector('[data-blok-testid="blok-editor"]');
|
|
459
|
+
|
|
460
|
+
if (editorWrapper) {
|
|
461
|
+
const overlay = document.createElement('div');
|
|
462
|
+
|
|
463
|
+
overlay.setAttribute('data-blok-overlay', '');
|
|
464
|
+
overlay.style.position = 'absolute';
|
|
465
|
+
overlay.style.inset = '0';
|
|
466
|
+
overlay.style.pointerEvents = 'none';
|
|
467
|
+
overlay.style.overflow = 'hidden';
|
|
468
|
+
overlay.setAttribute('data-blok-testid', 'selection-overlay');
|
|
469
|
+
|
|
470
|
+
const overlayContainer = document.createElement('div');
|
|
471
|
+
|
|
472
|
+
overlayContainer.setAttribute('data-blok-overlay-container', '');
|
|
473
|
+
overlayContainer.style.position = 'relative';
|
|
474
|
+
overlayContainer.style.width = '100%';
|
|
475
|
+
overlayContainer.style.height = '100%';
|
|
476
|
+
|
|
477
|
+
const rectangle = document.createElement('div');
|
|
478
|
+
|
|
479
|
+
rectangle.setAttribute('data-blok-overlay-rectangle', '');
|
|
480
|
+
rectangle.setAttribute('data-blok-testid', 'selection-rectangle');
|
|
481
|
+
rectangle.style.position = 'absolute';
|
|
482
|
+
rectangle.style.top = '50px';
|
|
483
|
+
rectangle.style.left = '20px';
|
|
484
|
+
rectangle.style.width = '200px';
|
|
485
|
+
rectangle.style.height = '100px';
|
|
486
|
+
rectangle.style.backgroundColor = 'rgba(46, 170, 220, 0.2)';
|
|
487
|
+
rectangle.style.border = '1px solid rgba(46, 170, 220, 0.5)';
|
|
488
|
+
rectangle.style.pointerEvents = 'none';
|
|
489
|
+
|
|
490
|
+
overlayContainer.appendChild(rectangle);
|
|
491
|
+
overlay.appendChild(overlayContainer);
|
|
492
|
+
editorWrapper.appendChild(overlay);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
await waitFor(
|
|
496
|
+
() => {
|
|
497
|
+
const rectangleOverlay = canvasElement.querySelector('[data-blok-testid="selection-rectangle"]');
|
|
498
|
+
|
|
499
|
+
expect(rectangleOverlay).toBeInTheDocument();
|
|
500
|
+
},
|
|
501
|
+
TIMEOUT_ACTION
|
|
502
|
+
);
|
|
503
|
+
});
|
|
504
|
+
},
|
|
505
|
+
};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/html-vite';
|
|
2
|
+
import type { OutputData } from '@/types';
|
|
3
|
+
import { createEditorContainer } from './helpers';
|
|
4
|
+
import type { EditorFactoryOptions } from './helpers';
|
|
5
|
+
import { Header, type HeaderConfig } from '../tools/header';
|
|
6
|
+
|
|
7
|
+
interface HeaderArgs extends EditorFactoryOptions {
|
|
8
|
+
minHeight: number;
|
|
9
|
+
data: OutputData | undefined;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Creates sample data with a header block at level 2 (default)
|
|
14
|
+
*/
|
|
15
|
+
const createHeaderData = (id: string): OutputData => ({
|
|
16
|
+
time: Date.now(),
|
|
17
|
+
version: '1.0.0',
|
|
18
|
+
blocks: [
|
|
19
|
+
{
|
|
20
|
+
id,
|
|
21
|
+
type: 'header',
|
|
22
|
+
data: { text: 'Sample Header Text', level: 2 },
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const createEditor = (args: HeaderArgs): HTMLElement => createEditorContainer({
|
|
28
|
+
...args,
|
|
29
|
+
tools: {
|
|
30
|
+
header: Header,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const meta: Meta<HeaderArgs> = {
|
|
35
|
+
title: 'Components/Header',
|
|
36
|
+
tags: ['autodocs'],
|
|
37
|
+
args: {
|
|
38
|
+
minHeight: 300,
|
|
39
|
+
data: createHeaderData('header-default'),
|
|
40
|
+
},
|
|
41
|
+
render: createEditor,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export default meta;
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
type Story = StoryObj<HeaderArgs>;
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Creates sample data with all header levels (H1-H6)
|
|
54
|
+
*/
|
|
55
|
+
const createAllHeaderLevelsData = (): OutputData => ({
|
|
56
|
+
time: Date.now(),
|
|
57
|
+
version: '1.0.0',
|
|
58
|
+
blocks: [
|
|
59
|
+
{ id: 'header-h1', type: 'header', data: { text: 'Heading 1', level: 1 } },
|
|
60
|
+
{ id: 'header-h2', type: 'header', data: { text: 'Heading 2', level: 2 } },
|
|
61
|
+
{ id: 'header-h3', type: 'header', data: { text: 'Heading 3', level: 3 } },
|
|
62
|
+
{ id: 'header-h4', type: 'header', data: { text: 'Heading 4', level: 4 } },
|
|
63
|
+
{ id: 'header-h5', type: 'header', data: { text: 'Heading 5', level: 5 } },
|
|
64
|
+
{ id: 'header-h6', type: 'header', data: { text: 'Heading 6', level: 6 } },
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Default header state (H2).
|
|
70
|
+
*/
|
|
71
|
+
export const Default: Story = {
|
|
72
|
+
args: {
|
|
73
|
+
data: createHeaderData('header-default'),
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* All header levels (H1-H6) displayed together.
|
|
79
|
+
* Shows all 6 heading levels at their default styles.
|
|
80
|
+
*/
|
|
81
|
+
export const AllLevels: Story = {
|
|
82
|
+
args: {
|
|
83
|
+
minHeight: 500,
|
|
84
|
+
data: createAllHeaderLevelsData(),
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
time: Date.now(),
|
|
90
|
+
version: '1.0.0',
|
|
91
|
+
blocks: [
|
|
92
|
+
{ id: 'header-h1', type: 'header', data: { text: 'Heading 1', level: 1 } },
|
|
93
|
+
{ id: 'header-h2', type: 'header', data: { text: 'Heading 2', level: 2 } },
|
|
94
|
+
{ id: 'header-h3', type: 'header', data: { text: 'Heading 3', level: 3 } },
|
|
95
|
+
{ id: 'header-h4', type: 'header', data: { text: 'Heading 4', level: 4 } },
|
|
96
|
+
{ id: 'header-h5', type: 'header', data: { text: 'Heading 5', level: 5 } },
|
|
97
|
+
{ id: 'header-h6', type: 'header', data: { text: 'Heading 6', level: 6 } },
|
|
98
|
+
],
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Custom header level overrides configuration with different font-sizes and margins.
|
|
103
|
+
*/
|
|
104
|
+
const customHeaderConfig: HeaderConfig = {
|
|
105
|
+
levelOverrides: {
|
|
106
|
+
1: { size: '100px', marginTop: '32px', marginBottom: '12px' },
|
|
107
|
+
2: { size: '90px', marginTop: '35px', marginBottom: '20px' },
|
|
108
|
+
3: { size: '80px', marginTop: '40px', marginBottom: '12px' },
|
|
109
|
+
4: { size: '70px', marginTop: '30px', marginBottom: '10px' },
|
|
110
|
+
5: { size: '60px', marginTop: '20px', marginBottom: '8px' },
|
|
111
|
+
6: { size: '50px', marginTop: '10px', marginBottom: '6px' },
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Creates an editor with custom header configuration.
|
|
117
|
+
*/
|
|
118
|
+
const createCustomHeaderEditor = (args: HeaderArgs): HTMLElement => createEditorContainer({
|
|
119
|
+
...args,
|
|
120
|
+
tools: {
|
|
121
|
+
header: {
|
|
122
|
+
class: Header,
|
|
123
|
+
config: customHeaderConfig,
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* All header levels with custom font-sizes and margins configured via levelOverrides.
|
|
130
|
+
*/
|
|
131
|
+
export const AllLevelsCustomStyles: Story = {
|
|
132
|
+
args: {
|
|
133
|
+
minHeight: 600,
|
|
134
|
+
data: createAllHeaderLevelsData(),
|
|
135
|
+
},
|
|
136
|
+
render: createCustomHeaderEditor,
|
|
137
|
+
};
|