@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,176 @@
1
+ <template>
2
+ <Teleport to="body">
3
+ <div
4
+ ref="scrollbarEl"
5
+ class="bk bk-artboard-scrollbar"
6
+ :class="[
7
+ { 'bk-is-active': isDraggingThumb },
8
+ 'bk-orientation-' + orientation,
9
+ ]"
10
+ @touchstart.prevent
11
+ @mousedown.stop.prevent="onClickScrollbar"
12
+ >
13
+ <button ref="button" @mousedown.capture.prevent.stop="onThumbMouseDown" />
14
+ </div>
15
+ </Teleport>
16
+ </template>
17
+
18
+ <script lang="ts" setup>
19
+ import onBlokkliEvent from '#blokkli/helpers/composables/onBlokkliEvent'
20
+ import { ref, onBeforeUnmount, onMounted } from '#imports'
21
+
22
+ const isDraggingThumb = ref(false)
23
+
24
+ const props = defineProps<{
25
+ padding: number
26
+ offset: number
27
+ rootSize: number
28
+ artboardSize: number
29
+ scale: number
30
+ orientation: 'height' | 'width'
31
+ }>()
32
+
33
+ type ScrollbarOptions = {
34
+ padding?: number
35
+ orientation?: 'height' | 'width'
36
+ }
37
+
38
+ class Scrollbar {
39
+ scrollStart = 0
40
+ thumbStart = 0
41
+ scrollbarSize = 0
42
+ padding = 50
43
+ offset = 0
44
+ rootSize = 0
45
+ artboardSize = 0
46
+ scale = 1
47
+ orientation: 'height' | 'width' = 'height'
48
+
49
+ constructor(options?: ScrollbarOptions) {
50
+ this.padding = options?.padding || this.padding
51
+ this.orientation = options?.orientation || this.orientation
52
+ }
53
+
54
+ getMouseCoordinate(e: MouseEvent): number {
55
+ return this.orientation === 'height' ? e.clientY : e.clientX
56
+ }
57
+ }
58
+
59
+ const scrollbar = new Scrollbar(props)
60
+
61
+ const scrollbarEl = ref<HTMLElement | null>(null)
62
+ const button = ref<HTMLButtonElement | null>(null)
63
+
64
+ const emit = defineEmits(['pageUp', 'pageDown', 'setOffset'])
65
+
66
+ let scrollStart = 0
67
+ let thumbStart = 0
68
+ let scrollbarSize = 300
69
+
70
+ const scrollTop = () =>
71
+ Math.round(props.offset - props.rootSize + props.padding)
72
+
73
+ // The scroll progress as a value from 0 to 1.
74
+ const scrollProgress = () => Math.abs(scrollTop() / scrollSize())
75
+ const thumbOffset = () => (scrollbarSize - scrollThumbSize()) * scrollProgress()
76
+
77
+ const scrollSize = () =>
78
+ props.artboardSize * props.scale + props.rootSize - 2 * props.padding
79
+
80
+ const scrollThumbSize = () => (props.rootSize / scrollSize()) * props.rootSize
81
+
82
+ function onThumbMouseDown(e: MouseEvent) {
83
+ isDraggingThumb.value = true
84
+ scrollStart = scrollbar.getMouseCoordinate(e)
85
+ thumbStart = thumbOffset()
86
+ document.body.addEventListener('mouseup', onMouseUp, {
87
+ passive: false,
88
+ capture: true,
89
+ })
90
+ document.body.addEventListener('mousemove', onThumbMouseMove, {
91
+ passive: false,
92
+ capture: true,
93
+ })
94
+ }
95
+
96
+ function onMouseUp() {
97
+ isDraggingThumb.value = false
98
+ document.body.removeEventListener('mousemove', onThumbMouseMove, {
99
+ capture: true,
100
+ })
101
+ document.body.removeEventListener('mouseup', onMouseUp, {
102
+ capture: true,
103
+ })
104
+ }
105
+
106
+ function getOffsetFromThumb(newThumb: number): number {
107
+ const maxThumb = scrollbarSize - scrollThumbSize()
108
+ const newScrollProgress = newThumb / maxThumb
109
+ const newScrollOffset = newScrollProgress * scrollSize()
110
+ return newScrollOffset + props.rootSize - props.padding
111
+ }
112
+
113
+ function onThumbMouseMove(e: MouseEvent) {
114
+ const diff = scrollStart - scrollbar.getMouseCoordinate(e)
115
+ const newThumb = Math.max(
116
+ Math.min(-thumbStart + diff, 0),
117
+ -(scrollbarSize - scrollThumbSize()),
118
+ )
119
+ emit('setOffset', getOffsetFromThumb(newThumb))
120
+ }
121
+
122
+ function getStyle() {
123
+ const offset = thumbOffset()
124
+ const size = scrollThumbSize()
125
+ if (props.orientation === 'height') {
126
+ return {
127
+ height: size + 'px',
128
+ transform: `translateY(${offset}px)`,
129
+ }
130
+ }
131
+ return {
132
+ width: size + 'px',
133
+ transform: `translateX(${offset}px)`,
134
+ }
135
+ }
136
+
137
+ function onClickScrollbar(e: MouseEvent) {
138
+ if (e.offsetY < thumbOffset()) {
139
+ emit('pageUp')
140
+ } else {
141
+ emit('pageDown')
142
+ }
143
+ }
144
+
145
+ const observer = new ResizeObserver((entries) => {
146
+ const size = entries[0]?.contentBoxSize?.[0]
147
+ if (!size) {
148
+ return
149
+ }
150
+
151
+ scrollbarSize =
152
+ props.orientation === 'height' ? size.blockSize : size.inlineSize
153
+ })
154
+
155
+ onBlokkliEvent('animationFrame', () => {
156
+ if (!button.value) {
157
+ return
158
+ }
159
+
160
+ const style = getStyle()
161
+
162
+ button.value.style.width = style.width || ''
163
+ button.value.style.height = style.height || ''
164
+ button.value.style.transform = style.transform
165
+ })
166
+
167
+ onMounted(() => {
168
+ if (scrollbarEl.value) {
169
+ observer.observe(scrollbarEl.value)
170
+ }
171
+ })
172
+
173
+ onBeforeUnmount(() => {
174
+ observer.disconnect()
175
+ })
176
+ </script>
@@ -0,0 +1,317 @@
1
+ <template>
2
+ <PluginToolbarButton
3
+ id="artboard_reset_zoom"
4
+ :title="$t('artboardResetZoom', 'Reset zoom')"
5
+ :shortcut-group="$t('artboard', 'Artboard')"
6
+ :tour-text="
7
+ $t(
8
+ 'artboardToolbarButtonTourText',
9
+ 'Shows the current zoom factor. Click on it to reset the zoom back to 100%.',
10
+ )
11
+ "
12
+ icon="magnifier"
13
+ meta
14
+ key-code="0"
15
+ region="view-options"
16
+ weight="10"
17
+ @click="resetZoom"
18
+ >
19
+ <div class="bk-feature-canvas-button">
20
+ <span>{{ zoomLevel }}</span>
21
+ </div>
22
+ </PluginToolbarButton>
23
+
24
+ <Scrollbar
25
+ :padding="props.padding"
26
+ :offset="ui.artboardOffset.value.y"
27
+ :root-size="ui.viewport.value.height"
28
+ :artboard-size="ui.artboardSize.value.height"
29
+ :scale="ui.artboardScale.value"
30
+ orientation="height"
31
+ @page-down="onPageDown"
32
+ @page-up="onPageUp"
33
+ @set-offset="setOffset('y', $event)"
34
+ />
35
+
36
+ <Scrollbar
37
+ :padding="props.padding"
38
+ :offset="ui.artboardOffset.value.x"
39
+ :root-size="ui.viewport.value.width"
40
+ :artboard-size="ui.artboardSize.value.width"
41
+ :scale="ui.artboardScale.value"
42
+ orientation="width"
43
+ @page-down="onPageDown"
44
+ @page-up="onPageUp"
45
+ @set-offset="setOffset('x', $event)"
46
+ />
47
+
48
+ <Teleport v-if="showDebug" to="body">
49
+ <div class="bk-artboard-debug">
50
+ <div v-for="v in debugValues" :key="v.key">
51
+ <div>{{ v.key }}</div>
52
+ <div>{{ v.value }}</div>
53
+ </div>
54
+ </div>
55
+ </Teleport>
56
+ </template>
57
+
58
+ <script lang="ts" setup>
59
+ import {
60
+ ref,
61
+ watch,
62
+ computed,
63
+ useBlokkli,
64
+ onMounted,
65
+ onBeforeUnmount,
66
+ } from '#imports'
67
+ import type { Coord } from '#blokkli/types'
68
+ import { PluginToolbarButton } from '#blokkli/plugins'
69
+ import Scrollbar from './Scrollbar/index.vue'
70
+ import onBlokkliEvent from '#blokkli/helpers/composables/onBlokkliEvent'
71
+ import defineShortcut from '#blokkli/helpers/composables/defineShortcut'
72
+ import { Artboard, type ArtboardOptions } from './Artboard'
73
+
74
+ const { context, storage, ui, animation, $t, dom } = useBlokkli()
75
+
76
+ const zoomLevel = computed(() => Math.round(ui.artboardScale.value * 100) + '%')
77
+
78
+ const showDebug = ref(false)
79
+
80
+ const props = withDefaults(
81
+ defineProps<{
82
+ padding?: number
83
+ minScale?: number
84
+ maxScale?: number
85
+ persist?: boolean
86
+ scrollSpeed?: number
87
+ }>(),
88
+ {
89
+ padding: 50,
90
+ minScale: 0.05,
91
+ maxScale: 3.5,
92
+ scrollSpeed: 1,
93
+ },
94
+ )
95
+
96
+ const options = computed<ArtboardOptions>(() => {
97
+ return {
98
+ maxScale: ui.isMobile.value ? 1 : 3,
99
+ scrollSpeed: props.scrollSpeed,
100
+ }
101
+ })
102
+
103
+ watch(options, function (newOptions) {
104
+ artboard.setOptions(newOptions)
105
+ })
106
+
107
+ type SavedState = {
108
+ offset: Coord
109
+ scale: number
110
+ }
111
+ const storageKey = computed(() => 'artboard:' + context.value.entityUuid)
112
+ const savedState = storage.use<SavedState | null>(storageKey, null)
113
+
114
+ const saveState = () => {
115
+ if (!props.persist) {
116
+ return
117
+ }
118
+ savedState.value = { offset: artboard.offset, scale: artboard.scale }
119
+ }
120
+
121
+ function getArtboard(): Artboard {
122
+ return new Artboard(ui.artboardElement(), ui.rootElement(), {
123
+ x: savedState.value?.offset.x,
124
+ y: savedState.value?.offset.y,
125
+ scale: savedState.value?.scale,
126
+ ...options.value,
127
+ })
128
+ }
129
+
130
+ const artboard = getArtboard()
131
+
132
+ function setOffset(key: 'x' | 'y', value: number) {
133
+ artboard.stopAnimate()
134
+ artboard.offset[key] = value
135
+ }
136
+
137
+ type DebugValue = {
138
+ key: string
139
+ value: string | number | boolean
140
+ }
141
+
142
+ const debugValues = ref<DebugValue[]>([])
143
+
144
+ const coordToString = (v: Coord): string =>
145
+ `x: ${Math.round(v.x)}, y: ${Math.round(v.y)}`
146
+
147
+ onBlokkliEvent('animationFrame:before', () => {
148
+ artboard.loop()
149
+ ui.artboardSize.value.height = artboard.artboardSize.height
150
+ ui.artboardSize.value.width = artboard.artboardSize.width
151
+ // We don't need much precision here, so we can round it.
152
+ // This also prevents updating rects in WebGL buffers for small changes.
153
+ ui.artboardOffset.value.x = Math.round(artboard.offset.x)
154
+ ui.artboardOffset.value.y = Math.round(artboard.offset.y)
155
+ ui.artboardScale.value = artboard.scale
156
+ animation.requestDraw()
157
+ if (!showDebug.value) {
158
+ return
159
+ }
160
+ debugValues.value = [
161
+ {
162
+ key: 'scale',
163
+ value: artboard.scale.toString(),
164
+ },
165
+ {
166
+ key: 'isScaling',
167
+ value: artboard.isScaling,
168
+ },
169
+ {
170
+ key: 'isDragging',
171
+ value: artboard.isDragging,
172
+ },
173
+ {
174
+ key: 'isTouching',
175
+ value: artboard.isTouching,
176
+ },
177
+ {
178
+ key: 'maxScale',
179
+ value: artboard.maxScale,
180
+ },
181
+ {
182
+ key: 'isMomentumScrolling',
183
+ value: artboard.isMomentumScrolling,
184
+ },
185
+ {
186
+ key: 'scaleMidpoint',
187
+ value: artboard.scaleMidpoint
188
+ ? coordToString(artboard.scaleMidpoint)
189
+ : 'undefined',
190
+ },
191
+ ]
192
+ })
193
+
194
+ onMounted(() => {
195
+ window.addEventListener('beforeunload', saveState)
196
+ })
197
+
198
+ onBeforeUnmount(() => {
199
+ saveState()
200
+ artboard.destroy()
201
+ window.removeEventListener('beforeunload', saveState)
202
+ })
203
+
204
+ const resetZoom = () => {
205
+ artboard.resetZoom()
206
+ }
207
+
208
+ function onPageUp() {
209
+ artboard.scrollPageUp()
210
+ animation.requestDraw()
211
+ }
212
+
213
+ function onPageDown() {
214
+ artboard.scrollPageDown()
215
+ animation.requestDraw()
216
+ }
217
+
218
+ onBlokkliEvent('keyPressed', (e) => {
219
+ if (e.code === 'Home') {
220
+ artboard.scrollToTop()
221
+ animation.requestDraw()
222
+ } else if (e.code === 'End') {
223
+ artboard.scrollToEnd()
224
+ animation.requestDraw()
225
+ } else if (e.code === 'PageUp') {
226
+ onPageUp()
227
+ } else if (e.code === 'PageDown') {
228
+ onPageDown()
229
+ } else if (e.code === 'ArrowUp') {
230
+ artboard.animateOrJumpBy(200)
231
+ animation.requestDraw()
232
+ } else if (e.code === 'ArrowDown') {
233
+ artboard.animateOrJumpBy(-200)
234
+ animation.requestDraw()
235
+ } else if (e.code === '0' && e.meta) {
236
+ artboard.resetZoom()
237
+ animation.requestDraw()
238
+ } else if (e.code === '1' && e.meta) {
239
+ artboard.scaleToFit()
240
+ animation.requestDraw()
241
+ }
242
+ })
243
+
244
+ defineShortcut(
245
+ [
246
+ {
247
+ code: 'Home',
248
+ label: $t('artboardScrollToTop', 'Scroll to top'),
249
+ },
250
+ {
251
+ code: 'End',
252
+ label: $t('artboardScrollToEnd', 'Scroll to end'),
253
+ },
254
+ {
255
+ code: 'PageUp',
256
+ label: $t('artboardScrollOnePageUp', 'Scroll one page up'),
257
+ },
258
+ {
259
+ code: 'PageDown',
260
+ label: $t('artboardScrollOnePageDown', 'Scroll one page down'),
261
+ },
262
+ {
263
+ code: 'ArrowUp',
264
+ label: $t('artboardScrollUp', 'Scroll up'),
265
+ },
266
+ {
267
+ code: 'ArrowDown',
268
+ label: $t('artboardScrollDown', 'Scroll down'),
269
+ },
270
+ {
271
+ code: '1',
272
+ label: $t('artboardScaleToFit', 'Scale to fit'),
273
+ meta: true,
274
+ },
275
+ ].map((v) => {
276
+ return { ...v, group: $t('artboard', 'Artboard') }
277
+ }),
278
+ )
279
+
280
+ onBlokkliEvent('scrollIntoView', (e) => {
281
+ artboard.stopAnimate()
282
+ const visible = dom.getBlockVisibilities()[e.uuid]
283
+ if (visible) {
284
+ return
285
+ }
286
+
287
+ const rect = dom.getBlockRect(e.uuid)
288
+ if (!rect) {
289
+ return
290
+ }
291
+
292
+ const rectY = rect.y * artboard.scale + artboard.offset.y
293
+
294
+ let targetY: number | null = null
295
+ const currentY = artboard.animationTarget?.y || artboard.offset.y
296
+ const rootHeight = ui.visibleViewportPadded.value.height
297
+
298
+ if (e.center) {
299
+ targetY =
300
+ currentY - rectY + props.padding + rootHeight / 2 - rect.height / 2
301
+ } else if (rectY < 70) {
302
+ targetY = currentY - (rectY - props.padding) + 70
303
+ } else if (rectY + rect.height > rootHeight) {
304
+ targetY = currentY + (rootHeight - (rectY + rect.height) - 40)
305
+ }
306
+
307
+ if (targetY) {
308
+ artboard.setOffset(artboard.offset.x, targetY)
309
+ }
310
+ })
311
+ </script>
312
+
313
+ <script lang="ts">
314
+ export default {
315
+ name: 'ArtboardManager',
316
+ }
317
+ </script>
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <ArtboardManager
3
+ :persist="settings.persist"
4
+ :scroll-speed="settings.scrollSpeed"
5
+ />
6
+ </template>
7
+
8
+ <script lang="ts" setup>
9
+ import ArtboardManager from './Manager/index.vue'
10
+ import { defineBlokkliFeature } from '#imports'
11
+
12
+ const { settings } = defineBlokkliFeature({
13
+ id: 'artboard',
14
+ label: 'Artboard',
15
+ icon: 'artboard',
16
+ description:
17
+ 'Wraps the entire page in an artboard that can be zoomed and moved using the mouse.',
18
+ settings: {
19
+ persist: {
20
+ type: 'checkbox',
21
+ default: true,
22
+ label: 'Persist position and zoom',
23
+ group: 'behavior',
24
+ viewports: ['desktop'],
25
+ },
26
+ scrollSpeed: {
27
+ type: 'slider',
28
+ default: 1,
29
+ label: 'Artboard scroll speed',
30
+ group: 'behavior',
31
+ viewports: ['desktop'],
32
+ min: 0.5,
33
+ max: 1.5,
34
+ step: 0.05,
35
+ },
36
+ },
37
+ screenshot: 'feature-artboard.jpg',
38
+ })
39
+ </script>
40
+
41
+ <script lang="ts">
42
+ export default {
43
+ name: 'Artboard',
44
+ }
45
+ </script>
@@ -0,0 +1,17 @@
1
+ <template>
2
+ <div class="bk-assistant-result-markup">
3
+ <div class="ck-content" v-html="markup" />
4
+ </div>
5
+ </template>
6
+
7
+ <script lang="ts" setup>
8
+ defineProps<{
9
+ markup: string
10
+ }>()
11
+ </script>
12
+
13
+ <script lang="ts">
14
+ export default {
15
+ name: 'AssistantResultMarkup',
16
+ }
17
+ </script>
@@ -0,0 +1,147 @@
1
+ <template>
2
+ <FormOverlay
3
+ id="assistant"
4
+ :title="$t('assistantDialogTitle', 'Generate content with AI assistant')"
5
+ icon="robot"
6
+ @close="onClose"
7
+ >
8
+ <div class="bk-assistant-form">
9
+ <div class="bk">
10
+ <p class="bk-lead">
11
+ {{
12
+ $t(
13
+ 'assistantDialogLead',
14
+ "Please enter what you'd like the assistant to generate.",
15
+ )
16
+ }}
17
+ </p>
18
+ <label class="bk-form-label" for="assistant_prompt">
19
+ {{ $t('assistantPromptLabel', 'Prompt') }}
20
+ </label>
21
+ <div class="bk-assistant-form-textarea">
22
+ <textarea
23
+ id="assistant_prompt"
24
+ v-model="prompt"
25
+ type="text"
26
+ class="bk-form-input"
27
+ rows="10"
28
+ :placeholder="
29
+ $t(
30
+ 'assistantPromptPlaceholder',
31
+ 'Generate content for a page about how taxes work in Switzerland',
32
+ )
33
+ "
34
+ required
35
+ />
36
+ <button
37
+ class="bk-button bk-is-small"
38
+ :class="{ 'bk-is-loading': isGenerating }"
39
+ @click.prevent="onGenerate"
40
+ >
41
+ Generate
42
+ </button>
43
+ </div>
44
+ </div>
45
+ <div class="bk-assistant-form-result">
46
+ <div class="bk-form-label">Result</div>
47
+ <div>
48
+ <template v-if="result">
49
+ <ResultMarkup
50
+ v-if="result.type === 'markup'"
51
+ :markup="result.content"
52
+ />
53
+ </template>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ <template #footer>
58
+ <button class="bk-button bk-is-primary" @click="onSubmit">
59
+ {{ $t('assistantDialogSubmit', 'Create blocks') }}
60
+ </button>
61
+ </template>
62
+ </FormOverlay>
63
+ </template>
64
+
65
+ <script setup lang="ts">
66
+ import { FormOverlay } from '#blokkli/components'
67
+ import type { AssistantResult } from '#blokkli/types'
68
+ import { useBlokkli, ref } from '#imports'
69
+ import ResultMarkup from './ResultMarkup/index.vue'
70
+
71
+ const { $t, adapter } = useBlokkli()
72
+
73
+ const emit = defineEmits<{
74
+ (e: 'close'): void
75
+ (e: 'submit', result: AssistantResult): void
76
+ }>()
77
+
78
+ const prompt = ref(
79
+ `Write content for a page talking about VueJS. Please come up with good titles and content for each section.
80
+
81
+ # Origins
82
+ Write about when Vue was created and by whom.
83
+
84
+ # Release of Vue 2
85
+ When was it released, what were the changes.
86
+
87
+ # Release of Vue 3
88
+ Write about the big changes introduced in Vue 3.
89
+
90
+ # Comparison to React
91
+ `,
92
+ )
93
+ const isGenerating = ref(false)
94
+ const result = ref<AssistantResult | null>({
95
+ type: 'markup',
96
+ content: `
97
+ <h2>Origins</h2>
98
+ <p>Vue was created in 2014 by Evan You, a former Google engineer. It was initially released to the public in February 2014.</p>
99
+
100
+ <h2>Release of Vue 2</h2>
101
+ <p>Vue 2 was released in September 2016. This release introduced significant improvements in performance and the virtual DOM implementation, making Vue even more efficient and capable.</p>
102
+
103
+ <h2>Release of Vue 3</h2>
104
+ <p>Vue 3, released in September 2020, brought several major changes, including the composition API, better TypeScript integration, and significant improvements in terms of performance, tree-shaking, and the overall developer experience.</p>
105
+
106
+ <h2>Comparison to React</h2>
107
+ <p>Vue is often compared to React due to their shared focus on building user interfaces. While React is developed and maintained by Facebook, Vue is an open-source project led by Evan You. Both frameworks have their strengths and weaknesses, and the choice between them often depends on the specific requirements of a project and the preferences of the development team.</p>
108
+ `,
109
+ })
110
+
111
+ const onSubmit = () => {
112
+ if (!result.value) {
113
+ emit('close')
114
+ return
115
+ }
116
+
117
+ emit('submit', result.value)
118
+ }
119
+ const onClose = () => {
120
+ emit('close')
121
+ }
122
+
123
+ const onGenerate = async () => {
124
+ if (isGenerating.value) {
125
+ return
126
+ }
127
+ isGenerating.value = true
128
+
129
+ try {
130
+ const fetched = await adapter.assistantGetResults!({
131
+ type: 'create',
132
+ prompt: prompt.value,
133
+ })
134
+ result.value = fetched || null
135
+ } catch (_e) {
136
+ // Noop.
137
+ }
138
+
139
+ isGenerating.value = false
140
+ }
141
+ </script>
142
+
143
+ <script lang="ts">
144
+ export default {
145
+ name: 'AssistantOverlay',
146
+ }
147
+ </script>
@@ -0,0 +1,7 @@
1
+ ## Overview
2
+
3
+ The `assistant` feature implements an [Add Action](/plugins/add-action) that can
4
+ be dragged anywhere on the page. Once placed, a modal overlay is shown with a
5
+ basic prompt textarea, where the user can enter a prompt. Clicking on _Generate_
6
+ calls the [adapter.assistantGetResults] method which is expected to return the
7
+ content that should be generated.