@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,144 @@
1
+ <template>
2
+ <div />
3
+ </template>
4
+
5
+ <script lang="ts" setup>
6
+ import onBlokkliEvent from '#blokkli/helpers/composables/onBlokkliEvent'
7
+ import type { DraggableExistingBlock, Rectangle } from '#blokkli/types'
8
+ import { useBlokkli, onBeforeUnmount } from '#imports'
9
+ import {
10
+ setBuffersAndAttributes,
11
+ drawBufferInfo,
12
+ type BufferInfo,
13
+ setUniforms,
14
+ } from 'twgl.js'
15
+ import vs from './vertex.glsl?raw'
16
+ import fs from './fragment.glsl?raw'
17
+ import { RectangleBufferCollector } from '#blokkli/helpers/webgl'
18
+ import { toShaderColor } from '#blokkli/helpers'
19
+
20
+ const props = defineProps<{
21
+ blocks: DraggableExistingBlock[]
22
+ gl: WebGLRenderingContext
23
+ }>()
24
+
25
+ const { animation, theme, dom } = useBlokkli()
26
+
27
+ const programInfo = animation.registerProgram('selection', props.gl, [vs, fs])
28
+
29
+ type SelectionRectangle = Rectangle & {
30
+ id: string
31
+ index: number
32
+ isInverted: boolean
33
+ radius: [number, number, number, number]
34
+ }
35
+
36
+ class SelectionRectangleBufferCollector extends RectangleBufferCollector<SelectionRectangle> {
37
+ uuids: string[] = []
38
+ lastCount = 0
39
+ prevKey = ''
40
+
41
+ getBufferInfo(force?: boolean): {
42
+ info: BufferInfo | null
43
+ hasChanged: boolean
44
+ } {
45
+ const key = props.blocks
46
+ .map((block) => {
47
+ const uuid = block.uuid
48
+ const rect = dom.getBlockRect(uuid)
49
+ if (!rect) {
50
+ return uuid + 'no_rect'
51
+ }
52
+
53
+ return uuid + rect.time
54
+ })
55
+ .join('_')
56
+
57
+ const hasChanged = force || this.prevKey !== key
58
+ if (hasChanged) {
59
+ this.reset()
60
+ this.lastCount = 0
61
+ for (let i = 0; i < props.blocks.length; i++) {
62
+ const block = props.blocks[i]
63
+ if (this.added.has(block.uuid)) {
64
+ continue
65
+ }
66
+ this.added.add(block.uuid)
67
+ const el = dom.getDragElement(block)
68
+ const rect = dom.getBlockRect(block.uuid)
69
+ if (!rect || !el) {
70
+ continue
71
+ }
72
+ const style = theme.getDraggableStyle(el)
73
+ this.addRectangle(
74
+ {
75
+ id: block.uuid,
76
+ height: rect.height,
77
+ width: rect.width,
78
+ x: rect.x,
79
+ y: rect.y,
80
+ radius: style.radius,
81
+ isInverted: style.isInverted,
82
+ },
83
+ style.isInverted ? 1 : 0,
84
+ )
85
+ this.lastCount++
86
+ }
87
+
88
+ this.prevKey = key
89
+ }
90
+
91
+ // Only update the buffer info if it has changed.
92
+ if (hasChanged) {
93
+ this.bufferInfo = this.createBufferInfo()
94
+ }
95
+
96
+ return { info: this.bufferInfo, hasChanged }
97
+ }
98
+ }
99
+
100
+ const collector = new SelectionRectangleBufferCollector(props.gl)
101
+
102
+ const uniforms = {
103
+ u_color_default: toShaderColor(theme.accent.value[700]),
104
+ u_color_inverted: [255, 255, 255],
105
+ }
106
+
107
+ onBlokkliEvent('canvas:draw', () => {
108
+ props.gl.useProgram(programInfo.program)
109
+
110
+ setUniforms(programInfo, uniforms)
111
+ animation.setSharedUniforms(props.gl, programInfo)
112
+ const { info, hasChanged } = collector.getBufferInfo()
113
+
114
+ // Nothing to draw.
115
+ if (!info) {
116
+ return
117
+ }
118
+
119
+ // Only update buffer and attributes when they have changed.
120
+ if (hasChanged) {
121
+ setBuffersAndAttributes(props.gl, programInfo, info)
122
+ }
123
+
124
+ drawBufferInfo(props.gl, info, props.gl.TRIANGLES)
125
+ })
126
+
127
+ onBlokkliEvent('ui:resized', function () {
128
+ collector.reset()
129
+ })
130
+
131
+ onBlokkliEvent('state:reloaded', function () {
132
+ collector.reset()
133
+ })
134
+
135
+ onBeforeUnmount(() => {
136
+ props.gl.clear(props.gl.COLOR_BUFFER_BIT)
137
+ })
138
+ </script>
139
+
140
+ <script lang="ts">
141
+ export default {
142
+ name: 'SelectionOverlay',
143
+ }
144
+ </script>
@@ -0,0 +1,85 @@
1
+ precision mediump float;
2
+
3
+ // [x, y] position.
4
+ attribute vec2 a_position;
5
+ // The [x,y,width, height] of the quad the vertex belongs to.
6
+ attribute vec4 a_quad;
7
+ attribute float a_rect_id;
8
+ attribute float a_rect_type;
9
+ attribute vec4 a_rect_radius;
10
+
11
+ // The global scaling applied to all quads.
12
+ uniform float u_scale;
13
+ uniform float u_dpi;
14
+ // The amount of pixels to offset on the x axis.
15
+ uniform float u_offset_x;
16
+ // The amount of pixels to offset on the y axis.
17
+ uniform float u_offset_y;
18
+ uniform vec2 u_resolution;
19
+ uniform vec3 u_color_default;
20
+ uniform vec3 u_color_inverted;
21
+
22
+ // The transformed quad for the fragment shader.
23
+ varying vec4 v_quad;
24
+ varying vec3 v_color;
25
+ varying vec4 v_rect_radius;
26
+ varying float v_thickness;
27
+ varying vec2 v_rect_size;
28
+ varying vec2 v_rect_center;
29
+ varying float v_transition;
30
+
31
+ void main() {
32
+ // Define the increase size in viewport terms (not affected by u_scale)
33
+ float thickness = (0.5 + smoothstep(0.3, 1.0, u_scale) * 2.5) * u_dpi;
34
+ float increaseSize = max(thickness, 15.0);
35
+
36
+ // Calculate the new dimensions of the quad
37
+ vec4 adjusted_quad = a_quad;
38
+ adjusted_quad.z += 2.0 * increaseSize; // increase width by 20px
39
+ adjusted_quad.w += 2.0 * increaseSize; // increase height by 20px
40
+
41
+ // Adjust vertex positions to scale from the center of the rectangle
42
+ // Calculate the center of the original quad
43
+ vec2 center = vec2(a_quad.x + a_quad.z / 2.0, a_quad.y + a_quad.w / 2.0);
44
+
45
+ // Adjust vertices to reflect new size
46
+ // Calculate new offset from center based on original vertex position relative to center
47
+ vec2 newOffset =
48
+ (a_position - center) *
49
+ (vec2(adjusted_quad.z, adjusted_quad.w) / vec2(a_quad.z, a_quad.w));
50
+
51
+ // New position is center plus the new offset
52
+ vec2 newPosition = center + newOffset;
53
+
54
+ // Apply global scale and offsets
55
+ vec2 offsetPosition = newPosition * u_scale;
56
+ offsetPosition.x += u_offset_x;
57
+ offsetPosition.y += u_offset_y;
58
+
59
+ // Normalize position for rendering
60
+ vec2 normalizedPosition = offsetPosition / u_resolution;
61
+
62
+ // Transform to screen space (-1 to 1)
63
+ vec2 screenSpacePosition = normalizedPosition * 2.0 - vec2(1.0, 1.0);
64
+ screenSpacePosition.y = -screenSpacePosition.y;
65
+
66
+ // Output final position in clip space
67
+ gl_Position = vec4(screenSpacePosition, 0.0, 1.0) * u_dpi;
68
+
69
+ vec4 transformed_quad = vec4(
70
+ (a_quad.x * u_scale + u_offset_x) * u_dpi,
71
+ (u_resolution.y - a_quad.y * u_scale - a_quad.w * u_scale - u_offset_y) *
72
+ u_dpi,
73
+ a_quad.z * u_scale * u_dpi,
74
+ a_quad.w * u_scale * u_dpi
75
+ );
76
+ v_quad = transformed_quad;
77
+
78
+ // Set color and other varying variables
79
+ v_color = a_rect_type > 0.5 ? u_color_inverted : u_color_default;
80
+ v_rect_radius = a_rect_radius * u_dpi;
81
+ v_thickness = thickness;
82
+ v_rect_size = vec2(v_quad.z, v_quad.w);
83
+ v_rect_center = vec2(v_quad.x + v_quad.z / 2.0, v_quad.y + v_quad.w / 2.0); // The pixel-space rectangle center location
84
+ v_transition = smoothstep(0.5, 0.8, u_scale);
85
+ }
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <Teleport :to="artboard">
3
+ <div class="bk bk-selection-overlay-fallback">
4
+ <div
5
+ v-for="item in items"
6
+ :key="item.uuid"
7
+ :style="{
8
+ top: item.rect.y + 'px',
9
+ left: item.rect.x + 'px',
10
+ width: item.rect.width + 'px',
11
+ height: item.rect.height + 'px',
12
+ }"
13
+ />
14
+ </div>
15
+ </Teleport>
16
+ </template>
17
+
18
+ <script setup lang="ts">
19
+ import { falsy } from '#blokkli/helpers'
20
+ import onBlokkliEvent from '#blokkli/helpers/composables/onBlokkliEvent'
21
+ import { useBlokkli, computed } from '#imports'
22
+
23
+ const props = defineProps<{
24
+ uuids: string[]
25
+ }>()
26
+
27
+ const { ui, dom } = useBlokkli()
28
+
29
+ const artboard = ui.artboardElement()
30
+
31
+ const items = computed(() => {
32
+ return props.uuids
33
+ .map((uuid) => {
34
+ const block = dom.findBlock(uuid)
35
+ if (!block) {
36
+ return null
37
+ }
38
+
39
+ const rect = dom.getBlockRect(uuid)
40
+ if (!rect) {
41
+ return null
42
+ }
43
+
44
+ return { uuid, rect }
45
+ })
46
+ .filter(falsy)
47
+ })
48
+
49
+ onBlokkliEvent('animationFrame', function () {})
50
+ </script>
@@ -0,0 +1,295 @@
1
+ <template>
2
+ <Overlay
3
+ v-if="isVisible && gl"
4
+ :blocks="selection.blocks.value"
5
+ :uuids="selection.uuids.value"
6
+ :gl="gl"
7
+ />
8
+ <OverlayFallback v-if="isVisible && !gl" :uuids="selection.uuids.value" />
9
+ </template>
10
+
11
+ <script lang="ts" setup>
12
+ import Overlay from './Overlay/index.vue'
13
+ import OverlayFallback from './OverlayFallback/index.vue'
14
+ import {
15
+ calculateIntersection,
16
+ getBounds,
17
+ intersects,
18
+ originatesFromTextInput,
19
+ } from '#blokkli/helpers'
20
+ import onBlokkliEvent from '#blokkli/helpers/composables/onBlokkliEvent'
21
+ import type { DraggableExistingBlock, Rectangle } from '#blokkli/types'
22
+ import {
23
+ computed,
24
+ useBlokkli,
25
+ defineBlokkliFeature,
26
+ ref,
27
+ watch,
28
+ } from '#imports'
29
+
30
+ defineBlokkliFeature({
31
+ id: 'selection',
32
+ icon: 'selection',
33
+ label: 'Selection',
34
+ description: 'Renders an overlay that highlights the selected blocks.',
35
+ })
36
+
37
+ const { selection, ui, eventBus, animation, dom, tour } = useBlokkli()
38
+
39
+ const gl = animation.gl()
40
+
41
+ const hasSelectedOnce = ref(false)
42
+
43
+ const stop = watch(selection.uuids, function () {
44
+ hasSelectedOnce.value = true
45
+ stop()
46
+ })
47
+
48
+ const isVisible = computed(
49
+ () =>
50
+ dom.isReady.value &&
51
+ !selection.isMultiSelecting.value &&
52
+ !selection.editableActive.value &&
53
+ !selection.isChangingOptions.value &&
54
+ !selection.isDragging.value &&
55
+ !ui.isAnimating.value &&
56
+ hasSelectedOnce.value,
57
+ )
58
+
59
+ /**
60
+ * Find the block that is most visible for the user.
61
+ *
62
+ * Most visible is determined by how much of the block intersects with the
63
+ * padded visible viewport area.
64
+ */
65
+ const findMostVisibleBlock = (): string | null => {
66
+ const viewport = ui.visibleViewportPadded.value
67
+ const uuids = dom.getVisibleBlocks()
68
+
69
+ let maxIntersection = 0
70
+ let maxY = 9999
71
+ let mostVisibleUuid: string | null = null
72
+
73
+ for (let i = 0; i < uuids.length; i++) {
74
+ const uuid = uuids[i]
75
+ const absoluteRect = dom.getBlockRect(uuid)
76
+ if (!absoluteRect) {
77
+ continue
78
+ }
79
+
80
+ const rect = ui.getViewportRelativeRect(absoluteRect)
81
+
82
+ // The intersection as a value from 0 to 1.
83
+ const intersection = calculateIntersection(rect, viewport)
84
+ if (
85
+ intersection &&
86
+ intersection > maxIntersection &&
87
+ rect.y < maxY &&
88
+ rect.y > 0
89
+ ) {
90
+ mostVisibleUuid = uuid
91
+ maxIntersection = intersection
92
+ maxY = rect.y
93
+ }
94
+ }
95
+
96
+ return mostVisibleUuid
97
+ }
98
+
99
+ const getSelectAllUuids = (
100
+ allBlocks: DraggableExistingBlock[],
101
+ currentlySelected: DraggableExistingBlock[],
102
+ ): string[] => {
103
+ // One or more blocks are selected.
104
+ if (currentlySelected.length >= 1) {
105
+ const selectedHostUuids = currentlySelected.map((block) => block.hostUuid)
106
+ const selectedHostTypes = currentlySelected.map((block) => block.hostType)
107
+ const selectedHostFieldNames = currentlySelected.map(
108
+ (block) => block.hostFieldName,
109
+ )
110
+ const selectedUuids = currentlySelected.map((v) => v.uuid)
111
+
112
+ const commonHostUuids = selectedHostUuids.filter(
113
+ (uuid, index, self) => self.indexOf(uuid) === index,
114
+ )
115
+ const commonHostTypes = selectedHostTypes.filter(
116
+ (type, index, self) => self.indexOf(type) === index,
117
+ )
118
+ const commonHostFieldNames = selectedHostFieldNames.filter(
119
+ (fieldName, index, self) => self.indexOf(fieldName) === index,
120
+ )
121
+
122
+ // Find all blocks that share the same host.
123
+ const newUuids = allBlocks
124
+ .filter(
125
+ (block) =>
126
+ commonHostUuids.includes(block.hostUuid) &&
127
+ commonHostTypes.includes(block.hostType) &&
128
+ commonHostFieldNames.includes(block.hostFieldName),
129
+ )
130
+ .map((block) => block.uuid)
131
+
132
+ const isSame = newUuids.every((uuid) => selectedUuids.includes(uuid))
133
+
134
+ if (!isSame) {
135
+ return newUuids
136
+ }
137
+ }
138
+
139
+ return allBlocks
140
+ .filter((block) => block.hostType !== 'block')
141
+ .map((block) => block.uuid)
142
+ }
143
+
144
+ /**
145
+ * Determine which blocks to select when the user is clicking on a block with the shift key.
146
+ */
147
+ const visuallySelectBlocks = (toggleUuid: string): string[] | undefined => {
148
+ const rects = dom.getBlockRects()
149
+ const allUuids = Object.keys(rects)
150
+ const selected = selection.uuids.value
151
+ // Nothing selected yet, so we select the new block.
152
+ if (selected.length === 0) {
153
+ return [toggleUuid]
154
+ }
155
+
156
+ const singleSelectedBlock =
157
+ selected.length === 1 ? dom.findBlock(selected[0]) : null
158
+
159
+ const toggleRect = rects[toggleUuid]
160
+ if (!toggleRect) {
161
+ return
162
+ }
163
+ const toggleBlock = dom.findBlock(toggleUuid)
164
+ if (!toggleBlock) {
165
+ return
166
+ }
167
+ const filter = (encompassingRect: Rectangle): string[] => {
168
+ const candidates: string[] = []
169
+ for (let i = 0; i < allUuids.length; i++) {
170
+ const uuid = allUuids[i]
171
+ const rect = rects[uuid]
172
+ if (!rect) {
173
+ continue
174
+ }
175
+
176
+ if (!intersects(rect, encompassingRect)) {
177
+ continue
178
+ }
179
+
180
+ const block = dom.findBlock(uuid)
181
+
182
+ if (!block) {
183
+ continue
184
+ }
185
+
186
+ if (
187
+ block.isNested === toggleBlock.isNested ||
188
+ singleSelectedBlock?.isNested === block.isNested
189
+ ) {
190
+ candidates.push(uuid)
191
+ }
192
+ }
193
+
194
+ return candidates
195
+ }
196
+ const isToggleSelected = selected.includes(toggleUuid)
197
+
198
+ // One block selected.
199
+ if (selected.length === 1) {
200
+ if (isToggleSelected) {
201
+ return []
202
+ }
203
+
204
+ const selectedUuid = selected[0]
205
+ const selectedRect = rects[selectedUuid]
206
+ if (!selectedRect) {
207
+ return
208
+ }
209
+ const encompassingRect = getBounds([selectedRect, toggleRect])
210
+ if (!encompassingRect) {
211
+ return
212
+ }
213
+
214
+ return filter(encompassingRect)
215
+ }
216
+
217
+ // More than one selected.
218
+ // Find the most upper left element excluding the toggleElement.
219
+ const upperLeftUuid = selected
220
+ .filter((uuid) => (isToggleSelected ? uuid !== toggleUuid : true))
221
+ .reduce((prev, current) => {
222
+ const prevRect = rects[prev]
223
+ const currentRect = rects[current]
224
+ return currentRect &&
225
+ prevRect &&
226
+ prevRect.x <= currentRect.x &&
227
+ prevRect.y <= currentRect.y
228
+ ? prev
229
+ : current
230
+ })
231
+
232
+ const upperLeftRect = rects[upperLeftUuid]
233
+ const encompassingRect = getBounds([upperLeftRect, toggleRect])
234
+ if (!encompassingRect) {
235
+ return
236
+ }
237
+
238
+ return filter(encompassingRect)
239
+ }
240
+
241
+ onBlokkliEvent('select:shiftToggle', (uuid) => {
242
+ const uuids = visuallySelectBlocks(uuid)
243
+ if (uuids) {
244
+ eventBus.emit('select', uuids)
245
+ }
246
+ })
247
+
248
+ onBlokkliEvent('keyPressed', (e) => {
249
+ if (selection.isDragging.value || selection.isMultiSelecting.value) {
250
+ return
251
+ }
252
+ if (e.code === 'Escape') {
253
+ eventBus.emit('select:end', [])
254
+ } else if (e.code === 'Tab') {
255
+ if (tour.isTouring.value) {
256
+ return
257
+ }
258
+ e.originalEvent.preventDefault()
259
+
260
+ // No block is selected.
261
+ if (selection.blocks.value.length !== 1) {
262
+ // Select the most visible block for the user.
263
+ const uuid = findMostVisibleBlock()
264
+ if (uuid) {
265
+ eventBus.emit('select', uuid)
266
+ eventBus.emit('scrollIntoView', { uuid })
267
+ }
268
+ return
269
+ }
270
+
271
+ if (e.shift) {
272
+ eventBus.emit('select:previous')
273
+ } else {
274
+ eventBus.emit('select:next')
275
+ }
276
+ animation.requestDraw()
277
+ } else if (e.code === 'a' && e.meta) {
278
+ // Regular native CTRL+A behaviour should not be overriden.
279
+ if (originatesFromTextInput(e.originalEvent)) {
280
+ return
281
+ }
282
+ e.originalEvent.preventDefault()
283
+ eventBus.emit(
284
+ 'select:end',
285
+ getSelectAllUuids(dom.getAllBlocks(), selection.blocks.value),
286
+ )
287
+ }
288
+ })
289
+ </script>
290
+
291
+ <script lang="ts">
292
+ export default {
293
+ name: 'Selection',
294
+ }
295
+ </script>
@@ -0,0 +1,141 @@
1
+ <template>
2
+ <div class="bk-settings-feature-setting" :class="'bk-is-' + setting.type">
3
+ <label v-if="setting.type === 'checkbox'" class="bk-checkbox-toggle">
4
+ <input
5
+ :checked="settingsStorage[settingsKey] as boolean"
6
+ type="checkbox"
7
+ class="peer"
8
+ @change="toggleCheckbox"
9
+ />
10
+ <div />
11
+ <span>{{ settingLabel }}</span>
12
+ </label>
13
+ <div v-else-if="setting.type === 'radios'">
14
+ <h3 class="bk-form-label">
15
+ {{ settingLabel }}
16
+ </h3>
17
+ <ul class="bk-settings-ui">
18
+ <li
19
+ v-for="[value, config] in Object.entries(setting.options)"
20
+ :key="value"
21
+ >
22
+ <label>
23
+ <input
24
+ :checked="settingsStorage[settingsKey] === value"
25
+ type="radio"
26
+ :value="true"
27
+ :name="settingsKey"
28
+ @change="setRadioValue(value)"
29
+ />
30
+ <Icon v-if="config.icon" :name="config.icon" />
31
+ <span>{{ getOptionLabel(value, config.label) }}</span>
32
+ </label>
33
+ </li>
34
+ </ul>
35
+ </div>
36
+ <div v-else-if="setting.type === 'method'">
37
+ <button class="bk-button" @click="setting.method()">
38
+ {{ settingLabel }}
39
+ </button>
40
+ </div>
41
+ <div v-else-if="setting.type === 'slider'">
42
+ <label class="bk-input-range">
43
+ <span>{{ settingLabel }}: {{ settingsStorage[settingsKey] }}</span>
44
+ <input
45
+ :value="settingsStorage[settingsKey]"
46
+ type="range"
47
+ :min="setting.min"
48
+ :max="setting.max"
49
+ :step="setting.step"
50
+ list="tickmarks"
51
+ @input="setSliderValue($event)"
52
+ />
53
+ <datalist id="tickmarks">
54
+ <option v-for="tick in tickmarks" :key="tick" :value="tick" />
55
+ </datalist>
56
+ </label>
57
+ </div>
58
+ </div>
59
+ </template>
60
+
61
+ <script lang="ts" setup>
62
+ import type { FeatureDefinitionSetting } from '#blokkli/types'
63
+ import { Icon } from '#blokkli/components'
64
+ import type { ValidFeatureKey } from '#blokkli-runtime/features'
65
+ import { useBlokkli, computed } from '#imports'
66
+
67
+ const props = defineProps<{
68
+ featureId: ValidFeatureKey
69
+ settingsKey: string
70
+ setting: FeatureDefinitionSetting
71
+ }>()
72
+
73
+ const { storage, $t: textTranslation } = useBlokkli()
74
+
75
+ const settingLabel = computed(() => {
76
+ return (
77
+ textTranslation(
78
+ 'feature_' + props.featureId + '_setting_' + props.settingsKey + '_label',
79
+ ) || props.setting.label
80
+ )
81
+ })
82
+
83
+ const getOptionLabel = (key: string, defaultLabel: string) => {
84
+ return (
85
+ textTranslation(
86
+ 'feature_' +
87
+ props.featureId +
88
+ '_setting_' +
89
+ props.settingsKey +
90
+ '_option_' +
91
+ key,
92
+ ) || defaultLabel
93
+ )
94
+ }
95
+
96
+ const settingsStorage = storage.use(
97
+ `feature:${props.featureId}:settings`,
98
+ {} as Record<string, boolean | string | number>,
99
+ )
100
+
101
+ const toggleCheckbox = () => {
102
+ const current = settingsStorage.value[props.settingsKey]
103
+ settingsStorage.value = {
104
+ ...settingsStorage.value,
105
+ [props.settingsKey]: !current,
106
+ }
107
+ }
108
+
109
+ const setRadioValue = (value: string) => {
110
+ settingsStorage.value = {
111
+ ...settingsStorage.value,
112
+ [props.settingsKey]: value,
113
+ }
114
+ }
115
+
116
+ const setSliderValue = (e: Event) => {
117
+ if (e.target instanceof HTMLInputElement) {
118
+ settingsStorage.value = {
119
+ ...settingsStorage.value,
120
+ [props.settingsKey]: Number.parseFloat(e.target.value),
121
+ }
122
+ }
123
+ }
124
+
125
+ const tickmarks = computed(() => {
126
+ if (props.setting.type === 'slider') {
127
+ const values: number[] = []
128
+ for (
129
+ let value = props.setting.min;
130
+ value <= props.setting.max;
131
+ value += props.setting.step
132
+ ) {
133
+ values.push(value)
134
+ }
135
+ values.push(props.setting.max)
136
+ return values
137
+ }
138
+
139
+ return []
140
+ })
141
+ </script>