@blokkli/editor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/dist/module.cjs +5 -0
  4. package/dist/module.d.mts +129 -0
  5. package/dist/module.d.ts +129 -0
  6. package/dist/module.json +12 -0
  7. package/dist/module.mjs +5430 -0
  8. package/dist/runtime/adapter/drupal/graphql/base.graphql +906 -0
  9. package/dist/runtime/adapter/drupal/graphql/comments.graphql +56 -0
  10. package/dist/runtime/adapter/drupal/graphql/fragments.graphql +25 -0
  11. package/dist/runtime/adapter/drupal/graphql/library.graphql +66 -0
  12. package/dist/runtime/adapter/drupal/graphql/search.graphql +19 -0
  13. package/dist/runtime/adapter/drupal/graphql/transform.graphql +27 -0
  14. package/dist/runtime/adapter/drupal/graphqlMiddleware.d.ts +2 -0
  15. package/dist/runtime/adapter/drupal/graphqlMiddleware.js +643 -0
  16. package/dist/runtime/adapter/index.d.ts +352 -0
  17. package/dist/runtime/adapter/index.js +3 -0
  18. package/dist/runtime/blokkliPlugins/AddAction/index.vue +87 -0
  19. package/dist/runtime/blokkliPlugins/ContextMenu/Menu/index.vue +95 -0
  20. package/dist/runtime/blokkliPlugins/ContextMenu/index.vue +49 -0
  21. package/dist/runtime/blokkliPlugins/DebugOverlay/index.vue +34 -0
  22. package/dist/runtime/blokkliPlugins/DroppableEdit/index.vue +73 -0
  23. package/dist/runtime/blokkliPlugins/ItemAction/index.vue +132 -0
  24. package/dist/runtime/blokkliPlugins/ItemDropdown/index.vue +42 -0
  25. package/dist/runtime/blokkliPlugins/MenuButton/index.vue +74 -0
  26. package/dist/runtime/blokkliPlugins/Sidebar/Detached/index.vue +334 -0
  27. package/dist/runtime/blokkliPlugins/Sidebar/index.vue +286 -0
  28. package/dist/runtime/blokkliPlugins/ToolbarButton/index.vue +104 -0
  29. package/dist/runtime/blokkliPlugins/TourItem/index.vue +45 -0
  30. package/dist/runtime/blokkliPlugins/ViewOption/index.vue +106 -0
  31. package/dist/runtime/blokkliPlugins/index.d.ts +12 -0
  32. package/dist/runtime/blokkliPlugins/index.js +24 -0
  33. package/dist/runtime/components/Blocks/Fragment/icon.svg +1 -0
  34. package/dist/runtime/components/Blocks/Fragment/index.vue +24 -0
  35. package/dist/runtime/components/Blocks/FromLibrary/index.vue +58 -0
  36. package/dist/runtime/components/BlokkliEditable.vue +73 -0
  37. package/dist/runtime/components/BlokkliField.vue +157 -0
  38. package/dist/runtime/components/BlokkliItem.vue +79 -0
  39. package/dist/runtime/components/BlokkliProvider.vue +160 -0
  40. package/dist/runtime/components/Edit/Actions/index.vue +263 -0
  41. package/dist/runtime/components/Edit/AddListItem/index.vue +116 -0
  42. package/dist/runtime/components/Edit/AnimationCanvas/index.vue +122 -0
  43. package/dist/runtime/components/Edit/AppMenu/index.vue +60 -0
  44. package/dist/runtime/components/Edit/BlokkliErrorBoundary.vue +64 -0
  45. package/dist/runtime/components/Edit/Dialog/index.vue +163 -0
  46. package/dist/runtime/components/Edit/DragInteractions/index.vue +439 -0
  47. package/dist/runtime/components/Edit/DraggableList.vue +110 -0
  48. package/dist/runtime/components/Edit/EditIndicator.vue +82 -0
  49. package/dist/runtime/components/Edit/EditProvider.vue +213 -0
  50. package/dist/runtime/components/Edit/Features/AddList/docs.md +4 -0
  51. package/dist/runtime/components/Edit/Features/AddList/index.vue +205 -0
  52. package/dist/runtime/components/Edit/Features/Artboard/Manager/Artboard.d.ts +204 -0
  53. package/dist/runtime/components/Edit/Features/Artboard/Manager/Artboard.js +748 -0
  54. package/dist/runtime/components/Edit/Features/Artboard/Manager/Scrollbar/index.vue +176 -0
  55. package/dist/runtime/components/Edit/Features/Artboard/Manager/index.vue +317 -0
  56. package/dist/runtime/components/Edit/Features/Artboard/index.vue +45 -0
  57. package/dist/runtime/components/Edit/Features/Assistant/Overlay/ResultMarkup/index.vue +17 -0
  58. package/dist/runtime/components/Edit/Features/Assistant/Overlay/index.vue +147 -0
  59. package/dist/runtime/components/Edit/Features/Assistant/docs.md +7 -0
  60. package/dist/runtime/components/Edit/Features/Assistant/index.vue +68 -0
  61. package/dist/runtime/components/Edit/Features/BlockAddList/docs.md +15 -0
  62. package/dist/runtime/components/Edit/Features/BlockAddList/index.vue +440 -0
  63. package/dist/runtime/components/Edit/Features/Clipboard/List/Item/File.vue +68 -0
  64. package/dist/runtime/components/Edit/Features/Clipboard/List/Item/Video.vue +56 -0
  65. package/dist/runtime/components/Edit/Features/Clipboard/List/index.vue +69 -0
  66. package/dist/runtime/components/Edit/Features/Clipboard/docs.md +16 -0
  67. package/dist/runtime/components/Edit/Features/Clipboard/index.vue +485 -0
  68. package/dist/runtime/components/Edit/Features/CommandPalette/Palette/Group/index.vue +61 -0
  69. package/dist/runtime/components/Edit/Features/CommandPalette/Palette/index.vue +280 -0
  70. package/dist/runtime/components/Edit/Features/CommandPalette/index.vue +51 -0
  71. package/dist/runtime/components/Edit/Features/Comments/AddForm/index.vue +32 -0
  72. package/dist/runtime/components/Edit/Features/Comments/Comment/index.vue +53 -0
  73. package/dist/runtime/components/Edit/Features/Comments/Overlay/Item/index.vue +100 -0
  74. package/dist/runtime/components/Edit/Features/Comments/Overlay/index.vue +133 -0
  75. package/dist/runtime/components/Edit/Features/Comments/docs.md +13 -0
  76. package/dist/runtime/components/Edit/Features/Comments/index.vue +110 -0
  77. package/dist/runtime/components/Edit/Features/Conversions/index.vue +98 -0
  78. package/dist/runtime/components/Edit/Features/Debug/Rects/index.vue +55 -0
  79. package/dist/runtime/components/Edit/Features/Debug/Viewport/index.vue +93 -0
  80. package/dist/runtime/components/Edit/Features/Debug/docs.md +3 -0
  81. package/dist/runtime/components/Edit/Features/Debug/index.vue +178 -0
  82. package/dist/runtime/components/Edit/Features/Delete/index.vue +43 -0
  83. package/dist/runtime/components/Edit/Features/DraggingOverlay/DragItems/index.vue +420 -0
  84. package/dist/runtime/components/Edit/Features/DraggingOverlay/DropTargets/fragment.glsl +58 -0
  85. package/dist/runtime/components/Edit/Features/DraggingOverlay/DropTargets/index.vue +808 -0
  86. package/dist/runtime/components/Edit/Features/DraggingOverlay/DropTargets/vertex.glsl +57 -0
  87. package/dist/runtime/components/Edit/Features/DraggingOverlay/index.vue +410 -0
  88. package/dist/runtime/components/Edit/Features/Duplicate/index.vue +109 -0
  89. package/dist/runtime/components/Edit/Features/Edit/index.vue +63 -0
  90. package/dist/runtime/components/Edit/Features/EditForm/Frame/index.vue +73 -0
  91. package/dist/runtime/components/Edit/Features/EditForm/index.vue +217 -0
  92. package/dist/runtime/components/Edit/Features/EditableField/Overlay/Contenteditable/index.vue +42 -0
  93. package/dist/runtime/components/Edit/Features/EditableField/Overlay/Frame/index.vue +68 -0
  94. package/dist/runtime/components/Edit/Features/EditableField/Overlay/Plaintext/index.vue +81 -0
  95. package/dist/runtime/components/Edit/Features/EditableField/Overlay/index.vue +357 -0
  96. package/dist/runtime/components/Edit/Features/EditableField/index.vue +192 -0
  97. package/dist/runtime/components/Edit/Features/EditableMask/index.vue +64 -0
  98. package/dist/runtime/components/Edit/Features/EntityTitle/index.vue +108 -0
  99. package/dist/runtime/components/Edit/Features/Exit/index.vue +38 -0
  100. package/dist/runtime/components/Edit/Features/FieldAreas/Overlay/index.vue +33 -0
  101. package/dist/runtime/components/Edit/Features/FieldAreas/index.vue +43 -0
  102. package/dist/runtime/components/Edit/Features/Fragments/Dialog/Item/index.vue +68 -0
  103. package/dist/runtime/components/Edit/Features/Fragments/Dialog/index.vue +137 -0
  104. package/dist/runtime/components/Edit/Features/Fragments/docs.md +101 -0
  105. package/dist/runtime/components/Edit/Features/Fragments/index.vue +86 -0
  106. package/dist/runtime/components/Edit/Features/Grid/index.vue +40 -0
  107. package/dist/runtime/components/Edit/Features/Help/Shortcuts/index.vue +71 -0
  108. package/dist/runtime/components/Edit/Features/Help/index.vue +53 -0
  109. package/dist/runtime/components/Edit/Features/History/index.vue +263 -0
  110. package/dist/runtime/components/Edit/Features/ImportExisting/Dialog/index.vue +140 -0
  111. package/dist/runtime/components/Edit/Features/ImportExisting/index.vue +92 -0
  112. package/dist/runtime/components/Edit/Features/Library/EditReusable/index.vue +0 -0
  113. package/dist/runtime/components/Edit/Features/Library/LibraryDialog/Item/index.vue +73 -0
  114. package/dist/runtime/components/Edit/Features/Library/LibraryDialog/index.vue +184 -0
  115. package/dist/runtime/components/Edit/Features/Library/ReusableDialog/index.vue +88 -0
  116. package/dist/runtime/components/Edit/Features/Library/docs.md +127 -0
  117. package/dist/runtime/components/Edit/Features/Library/index.vue +184 -0
  118. package/dist/runtime/components/Edit/Features/MediaLibrary/Library/index.vue +184 -0
  119. package/dist/runtime/components/Edit/Features/MediaLibrary/index.vue +182 -0
  120. package/dist/runtime/components/Edit/Features/MediaLibrary/types.d.ts +57 -0
  121. package/dist/runtime/components/Edit/Features/MediaLibrary/types.js +0 -0
  122. package/dist/runtime/components/Edit/Features/MultiSelect/Overlay/fragment.glsl +90 -0
  123. package/dist/runtime/components/Edit/Features/MultiSelect/Overlay/index.vue +289 -0
  124. package/dist/runtime/components/Edit/Features/MultiSelect/Overlay/vertex.glsl +182 -0
  125. package/dist/runtime/components/Edit/Features/MultiSelect/index.vue +76 -0
  126. package/dist/runtime/components/Edit/Features/Options/Form/Checkbox/index.vue +52 -0
  127. package/dist/runtime/components/Edit/Features/Options/Form/Checkboxes/index.vue +129 -0
  128. package/dist/runtime/components/Edit/Features/Options/Form/Color/index.vue +38 -0
  129. package/dist/runtime/components/Edit/Features/Options/Form/Group.vue +25 -0
  130. package/dist/runtime/components/Edit/Features/Options/Form/Item.vue +155 -0
  131. package/dist/runtime/components/Edit/Features/Options/Form/Number/index.vue +74 -0
  132. package/dist/runtime/components/Edit/Features/Options/Form/Radios/index.vue +135 -0
  133. package/dist/runtime/components/Edit/Features/Options/Form/Range/index.vue +47 -0
  134. package/dist/runtime/components/Edit/Features/Options/Form/Text/index.vue +38 -0
  135. package/dist/runtime/components/Edit/Features/Options/Form/index.vue +342 -0
  136. package/dist/runtime/components/Edit/Features/Options/index.vue +88 -0
  137. package/dist/runtime/components/Edit/Features/Ownership/index.vue +57 -0
  138. package/dist/runtime/components/Edit/Features/Preview/index.vue +45 -0
  139. package/dist/runtime/components/Edit/Features/PreviewGrant/QrCode/index.vue +30 -0
  140. package/dist/runtime/components/Edit/Features/PreviewGrant/index.vue +73 -0
  141. package/dist/runtime/components/Edit/Features/Publish/index.vue +50 -0
  142. package/dist/runtime/components/Edit/Features/ResponsivePreview/Frame/index.vue +81 -0
  143. package/dist/runtime/components/Edit/Features/ResponsivePreview/index.vue +217 -0
  144. package/dist/runtime/components/Edit/Features/Revert/index.vue +68 -0
  145. package/dist/runtime/components/Edit/Features/Search/Overlay/Results/Content/index.vue +165 -0
  146. package/dist/runtime/components/Edit/Features/Search/Overlay/Results/Page/index.vue +211 -0
  147. package/dist/runtime/components/Edit/Features/Search/Overlay/index.vue +214 -0
  148. package/dist/runtime/components/Edit/Features/Search/index.vue +79 -0
  149. package/dist/runtime/components/Edit/Features/Selection/Overlay/fragment.glsl +99 -0
  150. package/dist/runtime/components/Edit/Features/Selection/Overlay/index.vue +144 -0
  151. package/dist/runtime/components/Edit/Features/Selection/Overlay/vertex.glsl +85 -0
  152. package/dist/runtime/components/Edit/Features/Selection/OverlayFallback/index.vue +50 -0
  153. package/dist/runtime/components/Edit/Features/Selection/index.vue +295 -0
  154. package/dist/runtime/components/Edit/Features/Settings/Dialog/FeatureSetting/index.vue +141 -0
  155. package/dist/runtime/components/Edit/Features/Settings/Dialog/index.vue +138 -0
  156. package/dist/runtime/components/Edit/Features/Settings/index.vue +92 -0
  157. package/dist/runtime/components/Edit/Features/Structure/List/Field/index.vue +181 -0
  158. package/dist/runtime/components/Edit/Features/Structure/List/Item/index.vue +149 -0
  159. package/dist/runtime/components/Edit/Features/Structure/List/index.vue +55 -0
  160. package/dist/runtime/components/Edit/Features/Structure/index.vue +83 -0
  161. package/dist/runtime/components/Edit/Features/Theme/Color/index.vue +81 -0
  162. package/dist/runtime/components/Edit/Features/Theme/GeneratedCode/index.vue +24 -0
  163. package/dist/runtime/components/Edit/Features/Theme/index.vue +122 -0
  164. package/dist/runtime/components/Edit/Features/TouchActionBar/Bar/index.vue +26 -0
  165. package/dist/runtime/components/Edit/Features/TouchActionBar/index.vue +42 -0
  166. package/dist/runtime/components/Edit/Features/Tour/Overlay/index.vue +270 -0
  167. package/dist/runtime/components/Edit/Features/Tour/Popup/index.vue +36 -0
  168. package/dist/runtime/components/Edit/Features/Tour/docs.md +0 -0
  169. package/dist/runtime/components/Edit/Features/Tour/index.vue +46 -0
  170. package/dist/runtime/components/Edit/Features/Transform/docs.md +67 -0
  171. package/dist/runtime/components/Edit/Features/Transform/index.vue +177 -0
  172. package/dist/runtime/components/Edit/Features/Translations/Banner/index.vue +50 -0
  173. package/dist/runtime/components/Edit/Features/Translations/index.vue +193 -0
  174. package/dist/runtime/components/Edit/Features/Validations/Overlay/Item.vue +50 -0
  175. package/dist/runtime/components/Edit/Features/Validations/Overlay/index.vue +51 -0
  176. package/dist/runtime/components/Edit/Features/Validations/SidebarItem/index.vue +50 -0
  177. package/dist/runtime/components/Edit/Features/Validations/index.vue +70 -0
  178. package/dist/runtime/components/Edit/Features/index.vue +67 -0
  179. package/dist/runtime/components/Edit/FormOverlay/Header/index.vue +39 -0
  180. package/dist/runtime/components/Edit/FormOverlay/index.vue +52 -0
  181. package/dist/runtime/components/Edit/Highlight/index.vue +94 -0
  182. package/dist/runtime/components/Edit/Icon/index.vue +21 -0
  183. package/dist/runtime/components/Edit/ItemIcon/index.vue +27 -0
  184. package/dist/runtime/components/Edit/Loading/index.vue +19 -0
  185. package/dist/runtime/components/Edit/Messages/Item/index.vue +107 -0
  186. package/dist/runtime/components/Edit/Messages/index.vue +37 -0
  187. package/dist/runtime/components/Edit/PreviewProvider.vue +223 -0
  188. package/dist/runtime/components/Edit/RelativeTime/index.vue +37 -0
  189. package/dist/runtime/components/Edit/Resizable/index.vue +90 -0
  190. package/dist/runtime/components/Edit/ScaleToFit/index.vue +57 -0
  191. package/dist/runtime/components/Edit/ShortcutIndicator/index.vue +90 -0
  192. package/dist/runtime/components/Edit/Sortli/index.vue +92 -0
  193. package/dist/runtime/components/Edit/SystemRequirements/index.vue +91 -0
  194. package/dist/runtime/components/Edit/Toolbar/index.vue +106 -0
  195. package/dist/runtime/components/Edit/ViewportBlockingRect/index.vue +75 -0
  196. package/dist/runtime/components/Edit/index.d.ts +14 -0
  197. package/dist/runtime/components/Edit/index.js +28 -0
  198. package/dist/runtime/composables/defineBlokkli.d.ts +6 -0
  199. package/dist/runtime/composables/defineBlokkli.js +108 -0
  200. package/dist/runtime/composables/defineBlokkliFeature.d.ts +28 -0
  201. package/dist/runtime/composables/defineBlokkliFeature.js +62 -0
  202. package/dist/runtime/composables/defineBlokkliFragment.d.ts +3 -0
  203. package/dist/runtime/composables/defineBlokkliFragment.js +54 -0
  204. package/dist/runtime/composables/useBlokkli.d.ts +8 -0
  205. package/dist/runtime/composables/useBlokkli.js +5 -0
  206. package/dist/runtime/constants/index.d.ts +4 -0
  207. package/dist/runtime/constants/index.js +2 -0
  208. package/dist/runtime/css/output.css +1 -0
  209. package/dist/runtime/helpers/Artboard/index.d.ts +16 -0
  210. package/dist/runtime/helpers/Artboard/index.js +20 -0
  211. package/dist/runtime/helpers/DragStyle/index.d.ts +12 -0
  212. package/dist/runtime/helpers/DragStyle/index.js +86 -0
  213. package/dist/runtime/helpers/animationProvider.d.ts +25 -0
  214. package/dist/runtime/helpers/animationProvider.js +116 -0
  215. package/dist/runtime/helpers/broadcastProvider.d.ts +7 -0
  216. package/dist/runtime/helpers/broadcastProvider.js +26 -0
  217. package/dist/runtime/helpers/commandsProvider.d.ts +9 -0
  218. package/dist/runtime/helpers/commandsProvider.js +16 -0
  219. package/dist/runtime/helpers/composables/defineCommands.d.ts +2 -0
  220. package/dist/runtime/helpers/composables/defineCommands.js +10 -0
  221. package/dist/runtime/helpers/composables/defineDropAreas.d.ts +2 -0
  222. package/dist/runtime/helpers/composables/defineDropAreas.js +10 -0
  223. package/dist/runtime/helpers/composables/defineShortcut.d.ts +2 -0
  224. package/dist/runtime/helpers/composables/defineShortcut.js +19 -0
  225. package/dist/runtime/helpers/composables/defineTourItem.d.ts +2 -0
  226. package/dist/runtime/helpers/composables/defineTourItem.js +10 -0
  227. package/dist/runtime/helpers/composables/onBlokkliEvent.d.ts +2 -0
  228. package/dist/runtime/helpers/composables/onBlokkliEvent.js +10 -0
  229. package/dist/runtime/helpers/composables/useAnimationFrame.d.ts +1 -0
  230. package/dist/runtime/helpers/composables/useAnimationFrame.js +14 -0
  231. package/dist/runtime/helpers/composables/useDebugLogger.d.ts +2 -0
  232. package/dist/runtime/helpers/composables/useDebugLogger.js +5 -0
  233. package/dist/runtime/helpers/composables/useDelayedIntersectionObserver.d.ts +5 -0
  234. package/dist/runtime/helpers/composables/useDelayedIntersectionObserver.js +26 -0
  235. package/dist/runtime/helpers/debugProvider.d.ts +23 -0
  236. package/dist/runtime/helpers/debugProvider.js +65 -0
  237. package/dist/runtime/helpers/dom/index.d.ts +5 -0
  238. package/dist/runtime/helpers/dom/index.js +37 -0
  239. package/dist/runtime/helpers/domProvider.d.ts +46 -0
  240. package/dist/runtime/helpers/domProvider.js +446 -0
  241. package/dist/runtime/helpers/dropAreaProvider.d.ts +9 -0
  242. package/dist/runtime/helpers/dropAreaProvider.js +22 -0
  243. package/dist/runtime/helpers/easing.d.ts +3 -0
  244. package/dist/runtime/helpers/easing.js +16 -0
  245. package/dist/runtime/helpers/eventBus.d.ts +3 -0
  246. package/dist/runtime/helpers/eventBus.js +5 -0
  247. package/dist/runtime/helpers/featuresProvider.d.ts +23 -0
  248. package/dist/runtime/helpers/featuresProvider.js +16 -0
  249. package/dist/runtime/helpers/frameEventBus.d.ts +9 -0
  250. package/dist/runtime/helpers/frameEventBus.js +2 -0
  251. package/dist/runtime/helpers/index.d.ts +87 -0
  252. package/dist/runtime/helpers/index.js +467 -0
  253. package/dist/runtime/helpers/keyboardProvider.d.ts +17 -0
  254. package/dist/runtime/helpers/keyboardProvider.js +79 -0
  255. package/dist/runtime/helpers/options.d.ts +2 -0
  256. package/dist/runtime/helpers/options.js +21 -0
  257. package/dist/runtime/helpers/runtimeHelpers/index.d.ts +10 -0
  258. package/dist/runtime/helpers/runtimeHelpers/index.js +35 -0
  259. package/dist/runtime/helpers/selectionProvider.d.ts +62 -0
  260. package/dist/runtime/helpers/selectionProvider.js +149 -0
  261. package/dist/runtime/helpers/stateProvider.d.ts +35 -0
  262. package/dist/runtime/helpers/stateProvider.js +226 -0
  263. package/dist/runtime/helpers/storageProvider.d.ts +15 -0
  264. package/dist/runtime/helpers/storageProvider.js +61 -0
  265. package/dist/runtime/helpers/symbols.d.ts +16 -0
  266. package/dist/runtime/helpers/symbols.js +18 -0
  267. package/dist/runtime/helpers/textProvider.d.ts +4 -0
  268. package/dist/runtime/helpers/textProvider.js +20 -0
  269. package/dist/runtime/helpers/themeProvider.d.ts +27 -0
  270. package/dist/runtime/helpers/themeProvider.js +124 -0
  271. package/dist/runtime/helpers/tourProvider.d.ts +11 -0
  272. package/dist/runtime/helpers/tourProvider.js +19 -0
  273. package/dist/runtime/helpers/transform.d.ts +2 -0
  274. package/dist/runtime/helpers/transform.js +17 -0
  275. package/dist/runtime/helpers/typesProvider.d.ts +36 -0
  276. package/dist/runtime/helpers/typesProvider.js +138 -0
  277. package/dist/runtime/helpers/uiProvider.d.ts +36 -0
  278. package/dist/runtime/helpers/uiProvider.js +278 -0
  279. package/dist/runtime/helpers/webgl/index.d.ts +32 -0
  280. package/dist/runtime/helpers/webgl/index.js +132 -0
  281. package/dist/runtime/icons/alert.svg +6 -0
  282. package/dist/runtime/icons/area.svg +5 -0
  283. package/dist/runtime/icons/arrow-down.svg +1 -0
  284. package/dist/runtime/icons/arrow-left.svg +1 -0
  285. package/dist/runtime/icons/arrow-right.svg +1 -0
  286. package/dist/runtime/icons/arrow-up.svg +1 -0
  287. package/dist/runtime/icons/artboard-disabled.svg +9 -0
  288. package/dist/runtime/icons/artboard-enabled.svg +29 -0
  289. package/dist/runtime/icons/artboard.svg +1 -0
  290. package/dist/runtime/icons/bug.svg +1 -0
  291. package/dist/runtime/icons/button-pointer.svg +1 -0
  292. package/dist/runtime/icons/caret.svg +12 -0
  293. package/dist/runtime/icons/cellphone.svg +1 -0
  294. package/dist/runtime/icons/chat-question.svg +1 -0
  295. package/dist/runtime/icons/check.svg +1 -0
  296. package/dist/runtime/icons/checkbox.svg +5 -0
  297. package/dist/runtime/icons/checks.svg +1 -0
  298. package/dist/runtime/icons/chevron-left.svg +1 -0
  299. package/dist/runtime/icons/chevron-right.svg +1 -0
  300. package/dist/runtime/icons/clipboard.svg +5 -0
  301. package/dist/runtime/icons/close.svg +5 -0
  302. package/dist/runtime/icons/cog.svg +5 -0
  303. package/dist/runtime/icons/command.svg +1 -0
  304. package/dist/runtime/icons/comment.svg +5 -0
  305. package/dist/runtime/icons/comment_add.svg +5 -0
  306. package/dist/runtime/icons/convert.svg +1 -0
  307. package/dist/runtime/icons/cursor-move.svg +1 -0
  308. package/dist/runtime/icons/dead.svg +1 -0
  309. package/dist/runtime/icons/delete.svg +8 -0
  310. package/dist/runtime/icons/detach.svg +7 -0
  311. package/dist/runtime/icons/drag.svg +1 -0
  312. package/dist/runtime/icons/duplicate.svg +12 -0
  313. package/dist/runtime/icons/edit.svg +8 -0
  314. package/dist/runtime/icons/exit.svg +6 -0
  315. package/dist/runtime/icons/expand.svg +1 -0
  316. package/dist/runtime/icons/file.svg +1 -0
  317. package/dist/runtime/icons/form.svg +1 -0
  318. package/dist/runtime/icons/fragment.svg +1 -0
  319. package/dist/runtime/icons/grid.svg +13 -0
  320. package/dist/runtime/icons/group.svg +5 -0
  321. package/dist/runtime/icons/help.svg +1 -0
  322. package/dist/runtime/icons/history.svg +1 -0
  323. package/dist/runtime/icons/image.svg +1 -0
  324. package/dist/runtime/icons/import.svg +5 -0
  325. package/dist/runtime/icons/laptop.svg +1 -0
  326. package/dist/runtime/icons/list-view-grid.svg +1 -0
  327. package/dist/runtime/icons/list-view-horizontal.svg +1 -0
  328. package/dist/runtime/icons/loader.svg +1 -0
  329. package/dist/runtime/icons/logo.svg +5 -0
  330. package/dist/runtime/icons/magnifier.svg +5 -0
  331. package/dist/runtime/icons/menu.svg +1 -0
  332. package/dist/runtime/icons/minus.svg +1 -0
  333. package/dist/runtime/icons/monitor.svg +1 -0
  334. package/dist/runtime/icons/multi-select.svg +1 -0
  335. package/dist/runtime/icons/multimedia.svg +1 -0
  336. package/dist/runtime/icons/opacity.svg +5 -0
  337. package/dist/runtime/icons/open_in_new.svg +3 -0
  338. package/dist/runtime/icons/palette.svg +1 -0
  339. package/dist/runtime/icons/plus-box.svg +1 -0
  340. package/dist/runtime/icons/plus.svg +1 -0
  341. package/dist/runtime/icons/preview.svg +5 -0
  342. package/dist/runtime/icons/publish.svg +12 -0
  343. package/dist/runtime/icons/puzzle.svg +1 -0
  344. package/dist/runtime/icons/qrcode.svg +5 -0
  345. package/dist/runtime/icons/question.svg +5 -0
  346. package/dist/runtime/icons/redo.svg +12 -0
  347. package/dist/runtime/icons/resize.svg +1 -0
  348. package/dist/runtime/icons/reusable.svg +5 -0
  349. package/dist/runtime/icons/revert.svg +5 -0
  350. package/dist/runtime/icons/robot.svg +1 -0
  351. package/dist/runtime/icons/rotate-phone.svg +1 -0
  352. package/dist/runtime/icons/sad.svg +1 -0
  353. package/dist/runtime/icons/save.svg +1 -0
  354. package/dist/runtime/icons/script.svg +1 -0
  355. package/dist/runtime/icons/scrolltotop.svg +6 -0
  356. package/dist/runtime/icons/search.svg +1 -0
  357. package/dist/runtime/icons/selection.svg +5 -0
  358. package/dist/runtime/icons/spinner.svg +15 -0
  359. package/dist/runtime/icons/star.svg +1 -0
  360. package/dist/runtime/icons/swap-horizontal.svg +1 -0
  361. package/dist/runtime/icons/tablet.svg +1 -0
  362. package/dist/runtime/icons/textbox.svg +1 -0
  363. package/dist/runtime/icons/texturebox.svg +5 -0
  364. package/dist/runtime/icons/tiktok.svg +1 -0
  365. package/dist/runtime/icons/title.svg +1 -0
  366. package/dist/runtime/icons/tools.svg +1 -0
  367. package/dist/runtime/icons/translate.svg +5 -0
  368. package/dist/runtime/icons/tree.svg +5 -0
  369. package/dist/runtime/icons/tutor.svg +1 -0
  370. package/dist/runtime/icons/ui-list-horizontal.svg +19 -0
  371. package/dist/runtime/icons/ui-list-sidebar.svg +21 -0
  372. package/dist/runtime/icons/ui-list-vertical.svg +9 -0
  373. package/dist/runtime/icons/undo.svg +12 -0
  374. package/dist/runtime/icons/unstar.svg +1 -0
  375. package/dist/runtime/icons/upload.svg +1 -0
  376. package/dist/runtime/icons/user.svg +1 -0
  377. package/dist/runtime/icons/video-outline.svg +1 -0
  378. package/dist/runtime/icons/vimeo.svg +3 -0
  379. package/dist/runtime/icons/window-maximize.svg +1 -0
  380. package/dist/runtime/icons/window-minimize.svg +1 -0
  381. package/dist/runtime/icons/youtube.svg +3 -0
  382. package/dist/runtime/plugins/blokkliEditable.d.ts +2 -0
  383. package/dist/runtime/plugins/blokkliEditable.js +31 -0
  384. package/dist/runtime/public/Inter.var.woff2 +0 -0
  385. package/dist/runtime/types/blokkOptions.d.ts +83 -0
  386. package/dist/runtime/types/blokkOptions.js +0 -0
  387. package/dist/runtime/types/generatedModuleTypes.d.ts +41 -0
  388. package/dist/runtime/types/generatedModuleTypes.js +0 -0
  389. package/dist/runtime/types/index.d.ts +1052 -0
  390. package/dist/runtime/types/index.js +1 -0
  391. package/dist/runtime/types/theme.d.ts +33 -0
  392. package/dist/runtime/types/theme.js +0 -0
  393. package/dist/types.d.mts +1 -0
  394. package/dist/types.d.ts +1 -0
  395. package/package.json +103 -0
@@ -0,0 +1,67 @@
1
+ ## Overview
2
+
3
+ The `transform` feature implements a way to apply transform plugins to one or
4
+ more selected blocks.
5
+
6
+ The [getTransformPlugins()](/adapter/getTransformPlugins) method should return a
7
+ list of available transform plugins. The editor then lists the plugins that are
8
+ available for the selected blocks.
9
+
10
+ ## Usage in editor
11
+
12
+ The matching transform plugins are displayed in the block actions overlay for
13
+ one or more selected blocks. Selecting a transform plugin calls the
14
+ [applyTransformPlugin()](/adapter/applyTransformPlugin) method on the adapter
15
+ once (e.g. not separately for every block).
16
+
17
+ In addition, when dragging a block over another block where a transform plugin
18
+ would be available, the editor shows a small overlay of the first matching
19
+ transform plugin. When the user presses the CTRL key and then drops the selected
20
+ block onto the matching block, the transform plugin is also applied.
21
+
22
+ ## Examples
23
+
24
+ A transform plugin can do basically anything with the selection. Some ideas:
25
+
26
+ - Merge text of two or more text blocks
27
+ - Automatically translate the contents of a block to another language
28
+ - Extract parts of the block into new blocks, e.g. split every `<p>` into a
29
+ separate text block
30
+ - Wrap all selected blocks into a new block (e.g. with 5 image blocks selected,
31
+ adds a new gallery block containing the image blocks)
32
+
33
+ ## Defining a transform plugin
34
+
35
+ Every transform plugin is required to define these properties:
36
+
37
+ ### id: `string`
38
+
39
+ A unique ID of the transform plugin.
40
+
41
+ ### label: `string`
42
+
43
+ The human readable label of the plugin which is shown in the dropdown in the
44
+ editor.
45
+
46
+ ### bundles: `string[]`
47
+
48
+ Contains all block bundles for which the transform is available.
49
+
50
+ ### targetBundles: `string[]`
51
+
52
+ The possible bundles that could result after the transform is applied.
53
+
54
+ For example, when writing a transform plugin that converts blocks of bundle
55
+ `image` into a gallery block, the value of targetBundles should be
56
+ `['gallery']`.
57
+
58
+ ### min: `number`
59
+
60
+ The minimum number of blocks required. A transform plugin that merges text
61
+ blocks would set a minimum value of `2`. A plugin that translates text content
62
+ could define the min value as `1`.
63
+
64
+ ### max: `number`
65
+
66
+ The maximum number of blocks supported by the plugin. A value of `-1` indicates
67
+ unlimited amount of blocks.
@@ -0,0 +1,177 @@
1
+ <template>
2
+ <PluginItemDropdown
3
+ id="transform"
4
+ :title="$t('transformTo', 'Other actions')"
5
+ :enabled="!!(itemBundleIds.length && possibleTransforms.length)"
6
+ >
7
+ <button
8
+ v-for="transform in possibleTransforms"
9
+ :key="transform.id"
10
+ @click.prevent="onTransform(transform, selection.uuids.value)"
11
+ >
12
+ <div>
13
+ <div>{{ transform.label }}</div>
14
+ </div>
15
+ </button>
16
+ </PluginItemDropdown>
17
+ </template>
18
+
19
+ <script lang="ts" setup>
20
+ import {
21
+ computed,
22
+ watch,
23
+ useBlokkli,
24
+ defineBlokkliFeature,
25
+ useLazyAsyncData,
26
+ } from '#imports'
27
+ import { PluginItemDropdown } from '#blokkli/plugins'
28
+ import { onlyUnique } from '#blokkli/helpers'
29
+ import type {
30
+ DraggableExistingBlock,
31
+ DropArea,
32
+ TransformPlugin,
33
+ } from '#blokkli/types'
34
+ import { filterTransforms } from '#blokkli/helpers/transform'
35
+ import defineCommands from '#blokkli/helpers/composables/defineCommands'
36
+ import defineDropAreas from '#blokkli/helpers/composables/defineDropAreas'
37
+
38
+ const { adapter } = defineBlokkliFeature({
39
+ id: 'transform',
40
+ icon: 'script',
41
+ label: 'Transform',
42
+ requiredAdapterMethods: ['getTransformPlugins', 'applyTransformPlugin'],
43
+ description: 'Provides integration for block transform plugins.',
44
+ screenshot: 'feature-transform.jpg',
45
+ })
46
+
47
+ const { types, selection, state, $t, dom } = useBlokkli()
48
+
49
+ const {
50
+ data: plugins,
51
+ execute,
52
+ status,
53
+ } = await useLazyAsyncData(
54
+ () => {
55
+ return adapter.getTransformPlugins()
56
+ },
57
+ { immediate: false, default: () => [] },
58
+ )
59
+
60
+ watch(selection.uuids, async () => {
61
+ if (status.value === 'idle') {
62
+ execute()
63
+ }
64
+ })
65
+
66
+ async function onTransform(plugin: TransformPlugin, uuids: string[]) {
67
+ await state.mutateWithLoadingState(
68
+ () =>
69
+ adapter.applyTransformPlugin({
70
+ uuids,
71
+ pluginId: plugin.id,
72
+ }),
73
+ $t(
74
+ 'failedToTransform',
75
+ 'The action "@name" could not be executed.',
76
+ ).replace('@name', plugin.label),
77
+ )
78
+ }
79
+
80
+ const itemBundleIds = computed(() =>
81
+ selection.blocks.value.map((v) => v.itemBundle).filter(onlyUnique),
82
+ )
83
+
84
+ const possibleTransforms = computed<TransformPlugin[]>(() =>
85
+ filterTransforms(
86
+ plugins.value || [],
87
+ selection.uuids.value,
88
+ itemBundleIds.value,
89
+ types.allowedTypesInList.value,
90
+ ),
91
+ )
92
+
93
+ defineCommands(() =>
94
+ possibleTransforms.value.map((transform) => ({
95
+ id: 'transform:' + transform.id,
96
+ label: transform.label,
97
+ group: 'selection',
98
+ icon: 'script',
99
+ callback: () => onTransform(transform, selection.uuids.value),
100
+ })),
101
+ )
102
+
103
+ const getPossibleDropTransforms = (
104
+ plugins: TransformPlugin[],
105
+ allBlocks: DraggableExistingBlock[],
106
+ dragItems: DraggableExistingBlock[],
107
+ ): PossibleTransform[] => {
108
+ // Filter out the dragged items from allBlocks.
109
+ const notDraggedBlocks = allBlocks.filter(
110
+ (block) => !dragItems.find((dragItem) => dragItem.uuid === block.uuid),
111
+ )
112
+
113
+ // Determine possible plugins based on the dragged items.
114
+ const validPlugins = plugins.filter((plugin) => {
115
+ const draggedBundles = dragItems.map((item) => item.itemBundle)
116
+ return (
117
+ draggedBundles.every((bundle) => plugin.bundles.includes(bundle)) &&
118
+ dragItems.length + 1 >= plugin.min &&
119
+ (plugin.max === -1 || dragItems.length + 1 <= plugin.max)
120
+ )
121
+ })
122
+
123
+ // Find possible transformations for each valid plugin
124
+ const possibleTransforms: PossibleTransform[] = []
125
+ validPlugins.forEach((plugin) => {
126
+ notDraggedBlocks.forEach((block) => {
127
+ if (plugin.targetBundles.includes(block.itemBundle)) {
128
+ possibleTransforms.push({
129
+ plugin,
130
+ block,
131
+ })
132
+ }
133
+ })
134
+ })
135
+
136
+ return possibleTransforms
137
+ }
138
+
139
+ type PossibleTransform = {
140
+ plugin: TransformPlugin
141
+ block: DraggableExistingBlock
142
+ }
143
+
144
+ defineDropAreas((dragItems) => {
145
+ const existing = dragItems.filter(
146
+ (v) => v.itemType === 'existing',
147
+ ) as DraggableExistingBlock[]
148
+
149
+ if (!existing.length) {
150
+ return
151
+ }
152
+
153
+ const uuids = existing.map((v) => v.uuid)
154
+
155
+ return getPossibleDropTransforms(
156
+ plugins.value,
157
+ dom.getAllBlocks(),
158
+ existing,
159
+ ).map<DropArea>((v) => {
160
+ return {
161
+ id: `transform:${v.plugin.id}:${v.block.uuid}`,
162
+ label: v.plugin.label,
163
+ element: v.block.element(),
164
+ onDrop: () => {
165
+ const transformUuids = [v.block.uuid, ...uuids]
166
+ return onTransform(v.plugin, transformUuids)
167
+ },
168
+ }
169
+ })
170
+ })
171
+ </script>
172
+
173
+ <script lang="ts">
174
+ export default {
175
+ name: 'Transform',
176
+ }
177
+ </script>
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <div class="bk bk-translations-banner">
3
+ <Icon name="translate" />
4
+ <p v-html="text" />
5
+ <button class="bk-translations-banner-close" @click="onClick">
6
+ {{ $t('translationsBannerButton', 'Edit source language instead') }}
7
+ <Icon name="close" />
8
+ </button>
9
+ </div>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import { computed, useBlokkli } from '#imports'
14
+ import { Icon } from '#blokkli/components'
15
+ import type { Language } from '#blokkli/types'
16
+
17
+ const props = defineProps<{
18
+ activeLanguage: Language
19
+ }>()
20
+
21
+ const { $t, adapter, state } = useBlokkli()
22
+
23
+ const onClick = () => {
24
+ const sourceLanguage = state.translation.value.sourceLanguage
25
+ if (!sourceLanguage) {
26
+ throw new Error(
27
+ 'Missing property "sourceLanguage" in TranslationState object.',
28
+ )
29
+ }
30
+
31
+ const sourceTranslation = state.translation.value.translations?.find(
32
+ (v) => v.id === sourceLanguage,
33
+ )
34
+
35
+ if (!sourceTranslation) {
36
+ throw new Error(
37
+ `Failed to find translation for language "${sourceLanguage}".`,
38
+ )
39
+ }
40
+
41
+ adapter.changeLanguage!(sourceTranslation)
42
+ }
43
+
44
+ const text = computed(() => {
45
+ return $t(
46
+ 'translationsBannerText',
47
+ 'You are currently editing the <strong>@language</strong> translation. Some features like adding, moving or deleting blocks are not available.',
48
+ ).replace('@language', props.activeLanguage.name)
49
+ })
50
+ </script>
@@ -0,0 +1,193 @@
1
+ <template>
2
+ <Teleport to="#bk-toolbar-after-title">
3
+ <PluginTourItem
4
+ v-if="items.length"
5
+ id="translations"
6
+ :title="$t('translationsTourTitle', 'Translations')"
7
+ :text="
8
+ $t(
9
+ 'translationsTourText',
10
+ 'Quickly switch between available translations. A greyed out language indicates the content is not yet translated. Clicking on it opens the form to create a new translation for this language.',
11
+ )
12
+ "
13
+ >
14
+ <div class="bk-translations">
15
+ <button
16
+ v-if="isDropdown"
17
+ class="bk-toolbar-button"
18
+ :class="{ 'bk-is-active': isOpen }"
19
+ @click.stop.prevent="isOpen = !isOpen"
20
+ >
21
+ {{ activeLangcode }}
22
+ </button>
23
+ <div
24
+ v-if="isOpen || !isDropdown"
25
+ :class="
26
+ isDropdown
27
+ ? 'bk-translations-dropdown'
28
+ : 'bk-blokkli-item-options-radios bk-is-language'
29
+ "
30
+ >
31
+ <label
32
+ v-for="item in items"
33
+ :key="item.id"
34
+ :class="{ 'bk-is-muted': !item.translation?.exists }"
35
+ >
36
+ <div>
37
+ <input
38
+ type="radio"
39
+ :checked="item.checked"
40
+ :value="item.id"
41
+ name="pb_language"
42
+ @click.stop.prevent="onClick(item, $event)"
43
+ />
44
+ <span>{{ item.code }}</span>
45
+ <div :class="{ 'bk-tooltip': !isDropdown }">{{ item.label }}</div>
46
+ </div>
47
+ </label>
48
+ </div>
49
+ </div>
50
+ </PluginTourItem>
51
+ </Teleport>
52
+
53
+ <Teleport to="body">
54
+ <Banner
55
+ v-if="state.editMode.value === 'translating'"
56
+ :active-language="activeLanguage"
57
+ />
58
+ </Teleport>
59
+
60
+ <PluginMenuButton
61
+ id="translations"
62
+ :title="$t('translationsBatchTranslateMenuTitle', 'Translate...')"
63
+ :description="
64
+ $t('translationsBatchTranslateMenuDescription', 'Translate all blocks')
65
+ "
66
+ :disabled="editMode !== 'translating'"
67
+ :weight="60"
68
+ icon="translate"
69
+ @click="eventBus.emit('batchTranslate')"
70
+ />
71
+
72
+ <PluginItemAction
73
+ v-if="editMode === 'translating'"
74
+ id="translate"
75
+ :title="$t('translationsItemAction', 'Translate')"
76
+ icon="translate"
77
+ @click="onTranslate"
78
+ />
79
+ </template>
80
+
81
+ <script lang="ts" setup>
82
+ import {
83
+ ref,
84
+ computed,
85
+ useBlokkli,
86
+ defineBlokkliFeature,
87
+ onMounted,
88
+ } from '#imports'
89
+ import { falsy } from '#blokkli/helpers'
90
+ import {
91
+ PluginMenuButton,
92
+ PluginItemAction,
93
+ PluginTourItem,
94
+ } from '#blokkli/plugins'
95
+ import type {
96
+ DraggableExistingBlock,
97
+ EntityTranslation,
98
+ Language,
99
+ } from '#blokkli/types'
100
+ import Banner from './Banner/index.vue'
101
+
102
+ const { adapter } = defineBlokkliFeature({
103
+ id: 'translations',
104
+ label: 'Translations',
105
+ icon: 'translate',
106
+ requiredAdapterMethods: ['changeLanguage'],
107
+ description: 'Adds support for block translations.',
108
+ })
109
+
110
+ const { eventBus, state, context, $t, ui } = useBlokkli()
111
+ const { translation, editMode } = state
112
+
113
+ const isOpen = ref(false)
114
+
115
+ const isDropdown = computed(() => ui.isMobile.value || items.value.length > 5)
116
+ const activeLangcode = computed(() => context.value.language)
117
+ const activeLanguage = computed<Language>(() => {
118
+ return (
119
+ translation.value.availableLanguages?.find(
120
+ (v) => v.id === activeLangcode.value,
121
+ ) || {
122
+ id: activeLangcode.value,
123
+ name: activeLangcode.value,
124
+ }
125
+ )
126
+ })
127
+
128
+ type TranslationStateItem = {
129
+ id: string
130
+ code: string
131
+ label: string
132
+ checked: boolean
133
+ translation?: EntityTranslation
134
+ }
135
+
136
+ const items = computed<TranslationStateItem[]>(() => {
137
+ return (translation.value.availableLanguages || [])
138
+ .map((language) => {
139
+ if (language && language.id) {
140
+ return {
141
+ id: language.id,
142
+ code: language.id.toUpperCase(),
143
+ label: language.name,
144
+ checked: context.value.language === language.id,
145
+ translation: (translation.value.translations || []).find(
146
+ (v) => v.id === language.id,
147
+ ),
148
+ }
149
+ }
150
+ return null
151
+ })
152
+ .filter(falsy)
153
+ })
154
+
155
+ function onClick(item: TranslationStateItem, event: Event) {
156
+ if (item.translation?.exists) {
157
+ return adapter.changeLanguage(item.translation)
158
+ }
159
+
160
+ event.preventDefault()
161
+ if (item.translation) {
162
+ eventBus.emit('translateEntity', item.translation)
163
+ }
164
+ }
165
+
166
+ function onTranslate(items: DraggableExistingBlock[]) {
167
+ eventBus.emit('item:edit', {
168
+ uuid: items[0].uuid,
169
+ bundle: items[0].itemBundle,
170
+ })
171
+ }
172
+
173
+ onMounted(() => {
174
+ // Make sure the user is not trying to edit a translation that does not exist.
175
+ const translationExists = !!translation.value.translations?.find(
176
+ (v) => v.id === context.value.language,
177
+ )
178
+ if (!translationExists) {
179
+ const sourceTranslation = translation.value.translations?.find(
180
+ (v) => v.id === translation.value.sourceLanguage,
181
+ )
182
+ if (sourceTranslation) {
183
+ return adapter.changeLanguage(sourceTranslation)
184
+ }
185
+ }
186
+ })
187
+ </script>
188
+
189
+ <script lang="ts">
190
+ export default {
191
+ name: 'Translations',
192
+ }
193
+ </script>
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <div :style="style">
3
+ <div v-html="messages.join(', ')" />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { useBlokkli, ref, computed } from '#imports'
9
+ import onBlokkliEvent from '#blokkli/helpers/composables/onBlokkliEvent'
10
+ import type { Rectangle } from '#blokkli/types'
11
+
12
+ const { dom } = useBlokkli()
13
+
14
+ const props = defineProps<{
15
+ uuid: string
16
+ messages: string[]
17
+ }>()
18
+
19
+ const rect = ref<Rectangle | null>(null)
20
+
21
+ const style = computed(() => {
22
+ if (!rect.value) {
23
+ return
24
+ }
25
+
26
+ return {
27
+ transform: `translate(${rect.value.x}px, ${rect.value.y}px)`,
28
+ width: rect.value.width + 'px',
29
+ height: rect.value.height + 'px',
30
+ }
31
+ })
32
+
33
+ onBlokkliEvent('canvas:draw', () => {
34
+ const newRect = dom.getBlockRect(props.uuid)
35
+ if (!newRect) {
36
+ return
37
+ }
38
+
39
+ if (
40
+ newRect.width === rect.value?.width &&
41
+ newRect.height === rect.value.height &&
42
+ newRect.x === rect.value.x &&
43
+ newRect.y === rect.value.y
44
+ ) {
45
+ return
46
+ }
47
+
48
+ rect.value = newRect
49
+ })
50
+ </script>
@@ -0,0 +1,51 @@
1
+ <template>
2
+ <Teleport to=".bk-main-canvas">
3
+ <div class="bk bk-validations-overlay">
4
+ <OverlayItem v-for="item in items" :key="item.uuid" v-bind="item" />
5
+ </div>
6
+ </Teleport>
7
+ </template>
8
+
9
+ <script setup lang="ts">
10
+ import { falsy } from '#blokkli/helpers'
11
+ import type { Validation } from '#blokkli/types'
12
+ import { useBlokkli, computed } from '#imports'
13
+ import OverlayItem from './Item.vue'
14
+
15
+ const props = defineProps<{
16
+ validations: Validation[]
17
+ }>()
18
+
19
+ const { runtimeConfig } = useBlokkli()
20
+
21
+ const items = computed(() =>
22
+ Object.entries(
23
+ props.validations
24
+ .map((v) => {
25
+ if (v.entityType === runtimeConfig.itemEntityType && v.entityUuid) {
26
+ return {
27
+ uuid: v.entityUuid,
28
+ message: v.message,
29
+ }
30
+ }
31
+
32
+ return null
33
+ })
34
+ .filter(falsy)
35
+ .reduce<Record<string, string[]>>((acc, v) => {
36
+ if (!acc[v.uuid]) {
37
+ acc[v.uuid] = []
38
+ }
39
+
40
+ acc[v.uuid].push(v.message)
41
+
42
+ return acc
43
+ }, {}),
44
+ ).map((v) => {
45
+ return {
46
+ uuid: v[0],
47
+ messages: v[1],
48
+ }
49
+ }),
50
+ )
51
+ </script>
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <button class="bk-validation-item" @click.prevent="onClick">
3
+ <div v-if="block" class="bk-validation-item-header">
4
+ <ItemIcon :bundle="block.itemBundle" />
5
+ <div>{{ itemBundle?.label }}</div>
6
+ </div>
7
+ <div v-html="message" />
8
+ </button>
9
+ </template>
10
+
11
+ <script setup lang="ts">
12
+ import { useBlokkli, computed } from '#imports'
13
+ import { ItemIcon } from '#blokkli/components'
14
+
15
+ const props = defineProps<{
16
+ message: string
17
+ propertyPath?: string
18
+ code?: string
19
+ entityType?: string
20
+ entityUuid?: string
21
+ }>()
22
+
23
+ const { runtimeConfig, eventBus, dom, types } = useBlokkli()
24
+
25
+ const isBlock = computed(
26
+ () => props.entityType === runtimeConfig.itemEntityType,
27
+ )
28
+
29
+ const block = computed(() => {
30
+ if (isBlock.value && props.entityUuid) {
31
+ return dom.findBlock(props.entityUuid)
32
+ }
33
+
34
+ return null
35
+ })
36
+
37
+ const itemBundle = computed(() => {
38
+ if (block.value?.itemBundle) {
39
+ return types.getBlockBundleDefinition(block.value.itemBundle)
40
+ }
41
+
42
+ return null
43
+ })
44
+
45
+ function onClick() {
46
+ if (isBlock.value && props.entityUuid) {
47
+ eventBus.emit('scrollIntoView', { uuid: props.entityUuid, center: true })
48
+ }
49
+ }
50
+ </script>