@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,338 @@
|
|
|
1
|
+
import { isMobileScreen, keyCodes } from '../../utils';
|
|
2
|
+
import type { PopoverItem } from './components/popover-item';
|
|
3
|
+
import { PopoverItemDefault, PopoverItemType } from './components/popover-item';
|
|
4
|
+
import { PopoverItemHtml } from './components/popover-item/popover-item-html/popover-item-html';
|
|
5
|
+
import { PopoverDesktop } from './popover-desktop';
|
|
6
|
+
import { css, cssInline, CSSVariables, getNestedLevelAttrValue } from './popover.const';
|
|
7
|
+
import { DATA_ATTR } from '../../constants/data-attributes';
|
|
8
|
+
import type { PopoverParams } from '@/types/utils/popover/popover';
|
|
9
|
+
import { PopoverEvent } from '@/types/utils/popover/popover-event';
|
|
10
|
+
import { twMerge } from '../tw';
|
|
11
|
+
import { Flipper } from '../../flipper';
|
|
12
|
+
import { css as popoverItemCls } from './components/popover-item';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Inline popover height CSS variables
|
|
16
|
+
*/
|
|
17
|
+
const INLINE_HEIGHT = '38px';
|
|
18
|
+
const INLINE_HEIGHT_MOBILE = '46px';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Horizontal popover that is displayed inline with the content
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export class PopoverInline extends PopoverDesktop {
|
|
25
|
+
/**
|
|
26
|
+
* Returns true if a nested popover is currently open
|
|
27
|
+
*/
|
|
28
|
+
public get hasNestedPopoverOpen(): boolean {
|
|
29
|
+
return this.nestedPopover !== null && this.nestedPopover !== undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Closes the nested popover if one is open
|
|
34
|
+
*/
|
|
35
|
+
public closeNestedPopover(): void {
|
|
36
|
+
this.destroyNestedPopoverIfExists();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Closes popover - override as arrow function to match parent
|
|
41
|
+
*/
|
|
42
|
+
public override hide = (): void => {
|
|
43
|
+
// Call parent hide logic manually (can't use super for arrow functions)
|
|
44
|
+
this.setOpenTop(false);
|
|
45
|
+
this.setOpenLeft(false);
|
|
46
|
+
|
|
47
|
+
this.itemsDefault.forEach(item => item.reset());
|
|
48
|
+
|
|
49
|
+
if (this.search !== undefined) {
|
|
50
|
+
this.search.clear();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
this.destroyNestedPopoverIfExists();
|
|
54
|
+
this.flipper?.deactivate();
|
|
55
|
+
|
|
56
|
+
// Reset to closed inline styles
|
|
57
|
+
this.nodes.popover.className = twMerge(cssInline.popover);
|
|
58
|
+
if (this.nodes.popoverContainer) {
|
|
59
|
+
this.nodes.popoverContainer.className = twMerge(
|
|
60
|
+
css.popoverContainer,
|
|
61
|
+
cssInline.popoverContainer
|
|
62
|
+
);
|
|
63
|
+
this.nodes.popoverContainer.style.height = '';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Emit closed event (from abstract)
|
|
67
|
+
this.emit(PopoverEvent.Closed);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Constructs the instance
|
|
72
|
+
* @param params - instance parameters
|
|
73
|
+
*/
|
|
74
|
+
constructor(params: PopoverParams) {
|
|
75
|
+
const isHintEnabled = !isMobileScreen();
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Create a custom Flipper for inline toolbar that only responds to vertical navigation.
|
|
79
|
+
* Left/Right arrow keys should have no effect in the inline toolbar.
|
|
80
|
+
* Navigation is done via Up/Down arrows and Tab/Shift+Tab.
|
|
81
|
+
*/
|
|
82
|
+
const inlineFlipper = new Flipper({
|
|
83
|
+
focusedItemClass: popoverItemCls.focused,
|
|
84
|
+
allowedKeys: [
|
|
85
|
+
keyCodes.TAB,
|
|
86
|
+
keyCodes.UP,
|
|
87
|
+
keyCodes.DOWN,
|
|
88
|
+
keyCodes.ENTER,
|
|
89
|
+
],
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
super(
|
|
93
|
+
{
|
|
94
|
+
...params,
|
|
95
|
+
flipper: inlineFlipper,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
[PopoverItemType.Default]: {
|
|
99
|
+
/**
|
|
100
|
+
* We use button instead of div here to fix bug associated with focus loss (which leads to selection change) on click in safari
|
|
101
|
+
* @todo figure out better way to solve the issue
|
|
102
|
+
*/
|
|
103
|
+
wrapperTag: 'button',
|
|
104
|
+
hint: {
|
|
105
|
+
position: 'top',
|
|
106
|
+
alignment: 'center',
|
|
107
|
+
enabled: isHintEnabled,
|
|
108
|
+
},
|
|
109
|
+
/**
|
|
110
|
+
* Inline tools display icons without titles, so no gap is needed
|
|
111
|
+
*/
|
|
112
|
+
iconWithGap: false,
|
|
113
|
+
/**
|
|
114
|
+
* Mark items as inline for styling
|
|
115
|
+
*/
|
|
116
|
+
isInline: true,
|
|
117
|
+
},
|
|
118
|
+
[PopoverItemType.Html]: {
|
|
119
|
+
hint: {
|
|
120
|
+
position: 'top',
|
|
121
|
+
alignment: 'center',
|
|
122
|
+
enabled: isHintEnabled,
|
|
123
|
+
},
|
|
124
|
+
isInline: true,
|
|
125
|
+
},
|
|
126
|
+
[PopoverItemType.Separator]: {
|
|
127
|
+
isInline: true,
|
|
128
|
+
},
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
// Apply inline popover root styles
|
|
133
|
+
this.nodes.popover.className = twMerge(cssInline.popover);
|
|
134
|
+
|
|
135
|
+
// Apply inline container styles
|
|
136
|
+
if (this.nodes.popoverContainer) {
|
|
137
|
+
this.nodes.popoverContainer.className = twMerge(
|
|
138
|
+
css.popoverContainer,
|
|
139
|
+
cssInline.popoverContainer
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Apply inline items container styles
|
|
144
|
+
if (this.nodes.items) {
|
|
145
|
+
this.nodes.items.className = twMerge(css.items, 'flex');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Set inline height CSS variables
|
|
149
|
+
this.nodes.popover.style.setProperty('--height', INLINE_HEIGHT);
|
|
150
|
+
this.nodes.popover.style.setProperty('--height-mobile', INLINE_HEIGHT_MOBILE);
|
|
151
|
+
|
|
152
|
+
// Mark as inline popover for any remaining CSS (deprecated, but kept for backwards compatibility)
|
|
153
|
+
this.nodes.popover.setAttribute(DATA_ATTR.popoverInline, '');
|
|
154
|
+
|
|
155
|
+
this.flipper?.setHandleContentEditableTargets(true);
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* If active popover item has children, show them.
|
|
159
|
+
* This is needed to display link url text (which is displayed as a nested popover content)
|
|
160
|
+
* once you select <a> tag content in text
|
|
161
|
+
*/
|
|
162
|
+
this.items
|
|
163
|
+
.forEach((item) => {
|
|
164
|
+
if (!(item instanceof PopoverItemDefault) && !(item instanceof PopoverItemHtml)) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (item.hasChildren && item.isChildrenOpen) {
|
|
169
|
+
this.showNestedItems(item);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Returns visible element offset top
|
|
177
|
+
*/
|
|
178
|
+
public get offsetLeft(): number {
|
|
179
|
+
if (this.nodes.popoverContainer === null) {
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return this.nodes.popoverContainer.offsetLeft;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Open popover
|
|
188
|
+
*/
|
|
189
|
+
public override show(): void {
|
|
190
|
+
super.show();
|
|
191
|
+
|
|
192
|
+
// Apply inline opened styles to root
|
|
193
|
+
this.nodes.popover.className = twMerge(cssInline.popover, 'inline-block');
|
|
194
|
+
|
|
195
|
+
// Apply inline container opened styles (no animation for inline)
|
|
196
|
+
if (this.nodes.popoverContainer) {
|
|
197
|
+
this.nodes.popoverContainer.className = twMerge(
|
|
198
|
+
css.popoverContainer,
|
|
199
|
+
css.popoverContainerOpened,
|
|
200
|
+
cssInline.popoverContainer,
|
|
201
|
+
'animate-none'
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// Set height based on screen
|
|
205
|
+
const height = isMobileScreen() ? 'var(--height-mobile)' : 'var(--height)';
|
|
206
|
+
this.nodes.popoverContainer.style.height = height;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const containerRect = this.nestingLevel === 0
|
|
210
|
+
? this.nodes.popoverContainer?.getBoundingClientRect()
|
|
211
|
+
: undefined;
|
|
212
|
+
|
|
213
|
+
if (containerRect !== undefined) {
|
|
214
|
+
const width = `${containerRect.width}px`;
|
|
215
|
+
const heightPx = `${containerRect.height}px`;
|
|
216
|
+
|
|
217
|
+
this.nodes.popover.style.setProperty(CSSVariables.InlinePopoverWidth, width);
|
|
218
|
+
this.nodes.popover.style.width = width;
|
|
219
|
+
this.nodes.popover.style.height = heightPx;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
requestAnimationFrame(() => {
|
|
223
|
+
this.flipper?.deactivate();
|
|
224
|
+
this.flipper?.activate(this.flippableElements);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Disable hover event handling.
|
|
230
|
+
* Overrides parent's class behavior
|
|
231
|
+
*/
|
|
232
|
+
protected override handleHover(): void {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Sets CSS variable with position of item near which nested popover should be displayed.
|
|
238
|
+
* Is used to position nested popover right below clicked item
|
|
239
|
+
* @param nestedPopoverEl - nested popover element
|
|
240
|
+
* @param item – item near which nested popover should be displayed
|
|
241
|
+
*/
|
|
242
|
+
protected override setTriggerItemPosition(
|
|
243
|
+
nestedPopoverEl: HTMLElement,
|
|
244
|
+
item: PopoverItemDefault
|
|
245
|
+
): void {
|
|
246
|
+
const itemEl = item.getElement();
|
|
247
|
+
const itemOffsetLeft = itemEl ? itemEl.offsetLeft : 0;
|
|
248
|
+
const totalLeftOffset = this.offsetLeft + itemOffsetLeft;
|
|
249
|
+
|
|
250
|
+
nestedPopoverEl.style.setProperty(
|
|
251
|
+
CSSVariables.TriggerItemLeft,
|
|
252
|
+
totalLeftOffset + 'px'
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Handles displaying nested items for the item.
|
|
258
|
+
* Overriding in order to add toggling behaviour
|
|
259
|
+
* @param item – item to toggle nested popover for
|
|
260
|
+
*/
|
|
261
|
+
protected override showNestedItems(item: PopoverItemDefault | PopoverItemHtml): void {
|
|
262
|
+
if (this.nestedPopoverTriggerItem === item) {
|
|
263
|
+
this.destroyNestedPopoverIfExists();
|
|
264
|
+
|
|
265
|
+
this.nestedPopoverTriggerItem = null;
|
|
266
|
+
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
super.showNestedItems(item);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Creates and displays nested popover for specified item.
|
|
275
|
+
* Is used only on desktop
|
|
276
|
+
* @param item - item to display nested popover by
|
|
277
|
+
*/
|
|
278
|
+
protected showNestedPopoverForItem(item: PopoverItem): PopoverDesktop {
|
|
279
|
+
const nestedPopover = super.showNestedPopoverForItem(item);
|
|
280
|
+
const nestedPopoverEl = nestedPopover.getElement();
|
|
281
|
+
|
|
282
|
+
nestedPopover.flipper?.setHandleContentEditableTargets(true);
|
|
283
|
+
|
|
284
|
+
// Apply nested inline styles to the nested popover container
|
|
285
|
+
const nestedContainer = nestedPopoverEl.querySelector(`[${DATA_ATTR.popoverContainer}]`) as HTMLElement | null;
|
|
286
|
+
if (nestedContainer) {
|
|
287
|
+
nestedContainer.className = twMerge(
|
|
288
|
+
nestedContainer.className,
|
|
289
|
+
'h-fit p-1.5 flex-col',
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Apply nested inline styles to the items container
|
|
294
|
+
const nestedItems = nestedPopoverEl.querySelector(`[${DATA_ATTR.popoverItems}]`) as HTMLElement | null;
|
|
295
|
+
if (nestedItems) {
|
|
296
|
+
nestedItems.className = twMerge(nestedItems.className, 'block w-full');
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* We need to add data attribute with nesting level, which will help position nested popover.
|
|
301
|
+
* Currently only 'level-1' is used
|
|
302
|
+
*/
|
|
303
|
+
nestedPopoverEl.setAttribute(DATA_ATTR.nestedLevel, getNestedLevelAttrValue(nestedPopover.nestingLevel));
|
|
304
|
+
|
|
305
|
+
// Apply level-1 specific positioning styles
|
|
306
|
+
if (nestedPopover.nestingLevel === 1 && nestedContainer) {
|
|
307
|
+
nestedContainer.className = twMerge(nestedContainer.className, 'left-0');
|
|
308
|
+
// Set top position based on height
|
|
309
|
+
const topOffset = isMobileScreen() ? 'calc(var(--height-mobile) + 3px)' : 'calc(var(--height) + 3px)';
|
|
310
|
+
nestedContainer.style.top = topOffset;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return nestedPopover;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Overrides default item click handling.
|
|
318
|
+
* Helps to close nested popover once other item is clicked.
|
|
319
|
+
* @param item - clicked item
|
|
320
|
+
*/
|
|
321
|
+
protected override handleItemClick(item: PopoverItem): void {
|
|
322
|
+
if (item !== this.nestedPopoverTriggerItem) {
|
|
323
|
+
/**
|
|
324
|
+
* In case tool had special handling for toggling button (like link tool which modifies selection)
|
|
325
|
+
* we need to call handleClick on nested popover trigger item
|
|
326
|
+
*/
|
|
327
|
+
this.nestedPopoverTriggerItem?.handleClick();
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Then close the nested popover
|
|
331
|
+
*/
|
|
332
|
+
super.destroyNestedPopoverIfExists();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
super.handleItemClick(item);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { PopoverAbstract } from './popover-abstract';
|
|
2
|
+
import { ScrollLocker } from '../scroll-locker';
|
|
3
|
+
import { PopoverHeader } from './components/popover-header';
|
|
4
|
+
import { PopoverStatesHistory } from './utils/popover-states-history';
|
|
5
|
+
import type { PopoverMobileNodes, PopoverParams } from '@/types/utils/popover/popover';
|
|
6
|
+
import type { PopoverItemDefault, PopoverItemParams } from './components/popover-item';
|
|
7
|
+
import { PopoverItemType } from './components/popover-item';
|
|
8
|
+
import { css } from './popover.const';
|
|
9
|
+
import { DATA_ATTR } from '../../constants/data-attributes';
|
|
10
|
+
import { Dom } from '../../dom';
|
|
11
|
+
import { twMerge } from '../tw';
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Mobile Popover.
|
|
16
|
+
* On mobile devices Popover behaves like a fixed panel at the bottom of screen. Nested item appears like "pages" with the "back" button
|
|
17
|
+
*/
|
|
18
|
+
export class PopoverMobile extends PopoverAbstract<PopoverMobileNodes> {
|
|
19
|
+
/**
|
|
20
|
+
* ScrollLocker instance
|
|
21
|
+
*/
|
|
22
|
+
private scrollLocker = new ScrollLocker();
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Reference to popover header if exists
|
|
26
|
+
*/
|
|
27
|
+
private header: PopoverHeader | undefined | null;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* History of popover states for back navigation.
|
|
31
|
+
* Is used for mobile version of popover,
|
|
32
|
+
* where we can not display nested popover of the screen and
|
|
33
|
+
* have to render nested items in the same popover switching to new state
|
|
34
|
+
*/
|
|
35
|
+
private history = new PopoverStatesHistory();
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Flag that indicates if popover is hidden
|
|
39
|
+
*/
|
|
40
|
+
private isHidden = true;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Construct the instance
|
|
44
|
+
* @param params - popover params
|
|
45
|
+
*/
|
|
46
|
+
constructor(params: PopoverParams) {
|
|
47
|
+
super(params, {
|
|
48
|
+
[PopoverItemType.Default]: {
|
|
49
|
+
hint: {
|
|
50
|
+
enabled: false,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
[PopoverItemType.Html]: {
|
|
54
|
+
hint: {
|
|
55
|
+
enabled: false,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
this.nodes.overlay = Dom.make('div', [css.popoverOverlay], {
|
|
61
|
+
[DATA_ATTR.popoverOverlay]: '',
|
|
62
|
+
[DATA_ATTR.overlayHidden]: '',
|
|
63
|
+
'data-blok-testid': 'popover-overlay',
|
|
64
|
+
});
|
|
65
|
+
this.nodes.popover.insertBefore(this.nodes.overlay, this.nodes.popover.firstChild);
|
|
66
|
+
|
|
67
|
+
this.listeners.on(this.nodes.overlay, 'click', () => {
|
|
68
|
+
this.hide();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
/* Save state to history for proper navigation between nested and parent popovers */
|
|
72
|
+
this.history.push({ items: params.items });
|
|
73
|
+
|
|
74
|
+
// Set mobile offset CSS variable (moved from popover.css @screen mobile rule)
|
|
75
|
+
this.nodes.popoverContainer.style.setProperty('--offset', '5px');
|
|
76
|
+
|
|
77
|
+
// Apply mobile-specific classes to container
|
|
78
|
+
this.nodes.popoverContainer.className = twMerge(
|
|
79
|
+
css.popoverContainer,
|
|
80
|
+
css.popoverContainerMobile
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Open popover
|
|
86
|
+
*/
|
|
87
|
+
public show(): void {
|
|
88
|
+
this.nodes.overlay.removeAttribute(DATA_ATTR.overlayHidden);
|
|
89
|
+
this.nodes.overlay.className = twMerge(css.popoverOverlay, 'fixed inset-0 block visible z-[3] opacity-50 transition-opacity duration-[120ms] ease-in will-change-[opacity]');
|
|
90
|
+
|
|
91
|
+
super.show();
|
|
92
|
+
|
|
93
|
+
// Apply mobile opened state classes AFTER super.show() to override base class styles
|
|
94
|
+
// For mobile, we use max-h-none instead of max-h-[var(--max-height)] since mobile popovers
|
|
95
|
+
// should expand to fit their content
|
|
96
|
+
// Use z-[4] to ensure container is above the overlay (z-[3])
|
|
97
|
+
this.nodes.popoverContainer.className = twMerge(
|
|
98
|
+
css.popoverContainer,
|
|
99
|
+
css.popoverContainerMobile,
|
|
100
|
+
css.popoverContainerOpened,
|
|
101
|
+
'max-h-none z-[4] animate-[panelShowingMobile_250ms_ease]'
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
this.scrollLocker.lock();
|
|
105
|
+
|
|
106
|
+
this.isHidden = false;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Closes popover
|
|
111
|
+
*/
|
|
112
|
+
public hide(): void {
|
|
113
|
+
if (this.isHidden) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
super.hide();
|
|
118
|
+
this.nodes.overlay.setAttribute(DATA_ATTR.overlayHidden, '');
|
|
119
|
+
this.nodes.overlay.className = css.popoverOverlay;
|
|
120
|
+
|
|
121
|
+
// Reset to mobile base closed state
|
|
122
|
+
this.nodes.popoverContainer.className = twMerge(
|
|
123
|
+
css.popoverContainer,
|
|
124
|
+
css.popoverContainerMobile
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
this.scrollLocker.unlock();
|
|
128
|
+
|
|
129
|
+
this.history.reset();
|
|
130
|
+
|
|
131
|
+
this.isHidden = true;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Clears memory
|
|
136
|
+
*/
|
|
137
|
+
public destroy(): void {
|
|
138
|
+
super.destroy();
|
|
139
|
+
|
|
140
|
+
this.scrollLocker.unlock();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Handles displaying nested items for the item
|
|
145
|
+
* @param item – item to show nested popover for
|
|
146
|
+
*/
|
|
147
|
+
protected override showNestedItems(item: PopoverItemDefault): void {
|
|
148
|
+
/** Show nested items */
|
|
149
|
+
this.updateItemsAndHeader(item.children, item.title);
|
|
150
|
+
|
|
151
|
+
this.history.push({
|
|
152
|
+
title: item.title,
|
|
153
|
+
items: item.children,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Removes rendered popover items and header and displays new ones
|
|
159
|
+
* @param items - new popover items
|
|
160
|
+
* @param title - new popover header text
|
|
161
|
+
*/
|
|
162
|
+
private updateItemsAndHeader(items: PopoverItemParams[], title?: string ): void {
|
|
163
|
+
/** Re-render header */
|
|
164
|
+
if (this.header !== null && this.header !== undefined) {
|
|
165
|
+
this.header.destroy();
|
|
166
|
+
this.header = null;
|
|
167
|
+
}
|
|
168
|
+
const shouldRenderHeader = title !== undefined;
|
|
169
|
+
|
|
170
|
+
if (shouldRenderHeader) {
|
|
171
|
+
this.header = new PopoverHeader({
|
|
172
|
+
text: title,
|
|
173
|
+
onBackButtonClick: () => {
|
|
174
|
+
this.history.pop();
|
|
175
|
+
|
|
176
|
+
this.updateItemsAndHeader(this.history.currentItems, this.history.currentTitle);
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const headerElement = this.header?.getElement() ?? null;
|
|
182
|
+
|
|
183
|
+
if (shouldRenderHeader && headerElement !== null) {
|
|
184
|
+
this.nodes.popoverContainer.insertBefore(headerElement, this.nodes.popoverContainer.firstChild);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Re-render items */
|
|
188
|
+
this.items.forEach(item => item.getMountElement?.()?.remove());
|
|
189
|
+
|
|
190
|
+
this.items = this.buildItems(items);
|
|
191
|
+
|
|
192
|
+
this.items.forEach(item => {
|
|
193
|
+
const itemEl = item.getMountElement?.() ?? item.getElement();
|
|
194
|
+
|
|
195
|
+
if (itemEl === null) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
this.nodes.items?.appendChild(itemEl);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind CSS class names for popover component
|
|
3
|
+
*
|
|
4
|
+
* Classes are applied directly in components using twMerge for conflict resolution.
|
|
5
|
+
*/
|
|
6
|
+
export const css = {
|
|
7
|
+
// Popover container - base styles
|
|
8
|
+
popoverContainer: 'absolute flex flex-col overflow-hidden box-border opacity-0 pointer-events-none p-0 border-none z-[4] max-h-0 min-w-[var(--width)] w-[var(--width)] rounded-lg shadow-[0_3px_15px_-3px_theme(colors.popover-shadow)] left-[var(--popover-left)] top-[var(--popover-top)] bg-popover-bg',
|
|
9
|
+
|
|
10
|
+
// Popover container - mobile styles (applied conditionally)
|
|
11
|
+
// Reset left/top from base class since inset shorthand may not properly override them in twMerge
|
|
12
|
+
popoverContainerMobile: 'fixed max-w-none rounded-[10px] min-w-[calc(100%-var(--offset)*2)] left-auto top-auto inset-[auto_var(--offset)_calc(var(--offset)+env(safe-area-inset-bottom))_var(--offset)]',
|
|
13
|
+
|
|
14
|
+
// Popover container - opened state
|
|
15
|
+
popoverContainerOpened: 'opacity-100 pointer-events-auto p-1 max-h-[var(--max-height)] border border-popover-border animate-[panelShowing_100ms_ease]',
|
|
16
|
+
|
|
17
|
+
// Popover overlay
|
|
18
|
+
popoverOverlay: 'hidden bg-dark',
|
|
19
|
+
|
|
20
|
+
items: 'overflow-y-auto overscroll-contain',
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Tailwind CSS class names for inline popover
|
|
25
|
+
* These classes override base popover styles when used in inline context
|
|
26
|
+
*/
|
|
27
|
+
export const cssInline = {
|
|
28
|
+
// Popover root element for inline
|
|
29
|
+
popover: 'relative',
|
|
30
|
+
|
|
31
|
+
// Container for inline popover
|
|
32
|
+
popoverContainer: 'flex-row top-0 min-w-max w-max p-1 mobile:absolute',
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Helper to get nested level attribute value
|
|
37
|
+
* @param level - nesting level
|
|
38
|
+
*/
|
|
39
|
+
export const getNestedLevelAttrValue = (level: number): string => {
|
|
40
|
+
return `level-${level}`;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* CSS variables names to be used in popover
|
|
45
|
+
*/
|
|
46
|
+
export enum CSSVariables {
|
|
47
|
+
/**
|
|
48
|
+
* Stores nesting level of the popover
|
|
49
|
+
*/
|
|
50
|
+
NestingLevel = '--nesting-level',
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Stores actual popover height. Used for desktop popovers
|
|
54
|
+
*/
|
|
55
|
+
PopoverHeight = '--popover-height',
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Width of the inline popover
|
|
59
|
+
*/
|
|
60
|
+
InlinePopoverWidth = '--inline-popover-width',
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Top position of the popover container
|
|
64
|
+
*/
|
|
65
|
+
PopoverTop = '--popover-top',
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Left position of the popover container
|
|
69
|
+
*/
|
|
70
|
+
PopoverLeft = '--popover-left',
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Offset from left of the inline popover item click on which triggers the nested popover opening
|
|
74
|
+
*/
|
|
75
|
+
TriggerItemLeft = '--trigger-item-left',
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Offset from top of the desktop popover item click on which triggers the nested popover opening
|
|
79
|
+
*/
|
|
80
|
+
TriggerItemTop = '--trigger-item-top',
|
|
81
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { PopoverItemParams } from '@/types/utils/popover/popover-item';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Represents single states history item
|
|
5
|
+
*/
|
|
6
|
+
interface PopoverStatesHistoryItem {
|
|
7
|
+
/**
|
|
8
|
+
* Popover title
|
|
9
|
+
*/
|
|
10
|
+
title?: string;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Popover items
|
|
14
|
+
*/
|
|
15
|
+
items: PopoverItemParams[]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Manages items history inside popover. Allows to navigate back in history
|
|
20
|
+
*/
|
|
21
|
+
export class PopoverStatesHistory {
|
|
22
|
+
/**
|
|
23
|
+
* Previous items states
|
|
24
|
+
*/
|
|
25
|
+
private history: PopoverStatesHistoryItem[] = [];
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Push new popover state
|
|
29
|
+
* @param state - new state
|
|
30
|
+
*/
|
|
31
|
+
public push(state: PopoverStatesHistoryItem): void {
|
|
32
|
+
this.history.push(state);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Pop last popover state
|
|
37
|
+
*/
|
|
38
|
+
public pop(): PopoverStatesHistoryItem | undefined {
|
|
39
|
+
return this.history.pop();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Title retrieved from the current state
|
|
44
|
+
*/
|
|
45
|
+
public get currentTitle(): string | undefined {
|
|
46
|
+
if (this.history.length === 0) {
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return this.history[this.history.length - 1].title;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Items list retrieved from the current state
|
|
55
|
+
*/
|
|
56
|
+
public get currentItems(): PopoverItemParams[] {
|
|
57
|
+
if (this.history.length === 0) {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return this.history[this.history.length - 1].items;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns history to initial popover state
|
|
66
|
+
*/
|
|
67
|
+
public reset(): void {
|
|
68
|
+
while (this.history.length > 1) {
|
|
69
|
+
this.pop();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|