@blokkli/editor 2.0.0-alpha.16 → 2.0.0-alpha.18

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 (194) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +640 -137
  3. package/dist/modules/drupal/graphql/base/fragment.blokkliProps.graphql +1 -1
  4. package/dist/modules/drupal/graphql/base/fragment.paragraphsFieldItem.graphql +3 -1
  5. package/dist/modules/drupal/graphql/base/query.pbConfig.graphql +1 -10
  6. package/dist/modules/drupal/graphql/features/comments.graphql +11 -8
  7. package/dist/modules/drupal/graphql/mutations/set_paragraph_schedule.graphql +15 -0
  8. package/dist/modules/drupal/index.mjs +33 -0
  9. package/dist/modules/drupal/runtime/adapter/index.js +12 -4
  10. package/dist/runtime/adapter/index.d.ts +21 -0
  11. package/dist/runtime/blokkliPlugins/ContextMenu/Menu/index.vue +3 -0
  12. package/dist/runtime/blokkliPlugins/ItemAction/index.vue +23 -15
  13. package/dist/runtime/blokkliPlugins/ItemAction/index.vue.d.ts +20 -44
  14. package/dist/runtime/blokkliPlugins/TourItem/index.vue +10 -5
  15. package/dist/runtime/components/Blocks/FromLibrary/index.vue +4 -2
  16. package/dist/runtime/components/BlokkliEditable.vue +32 -14
  17. package/dist/runtime/components/BlokkliField.vue +3 -0
  18. package/dist/runtime/components/BlokkliField.vue.d.ts +3 -3
  19. package/dist/runtime/components/BlokkliItem.vue +1 -1
  20. package/dist/runtime/components/BlokkliItem.vue.d.ts +4 -2
  21. package/dist/runtime/components/BlokkliProvider.vue +41 -28
  22. package/dist/runtime/components/BlokkliProvider.vue.d.ts +2 -1
  23. package/dist/runtime/components/Edit/Actions/index.vue +36 -20
  24. package/dist/runtime/components/Edit/AnimationCanvas/index.vue +436 -25
  25. package/dist/runtime/components/Edit/ArtboardTooltip/index.vue +83 -0
  26. package/dist/runtime/components/Edit/ArtboardTooltip/index.vue.d.ts +32 -0
  27. package/dist/runtime/components/Edit/Banner/index.vue +51 -0
  28. package/dist/runtime/components/Edit/Banner/index.vue.d.ts +18 -0
  29. package/dist/runtime/components/Edit/Dialog/index.vue +6 -4
  30. package/dist/runtime/components/Edit/DraggableList.vue +15 -7
  31. package/dist/runtime/components/Edit/DraggableList.vue.d.ts +5 -5
  32. package/dist/runtime/components/Edit/EditIndicator.vue +118 -44
  33. package/dist/runtime/components/Edit/EditIndicator.vue.d.ts +3 -0
  34. package/dist/runtime/components/Edit/EditProvider.vue +101 -31
  35. package/dist/runtime/components/Edit/EditProvider.vue.d.ts +3 -0
  36. package/dist/runtime/components/Edit/Features/AddList/index.vue +9 -11
  37. package/dist/runtime/components/Edit/Features/Analyze/Overlay/index.vue +28 -26
  38. package/dist/runtime/components/Edit/Features/Analyze/Renderer.vue +1 -1
  39. package/dist/runtime/components/Edit/Features/Analyze/Results/ResultsItemNodesTarget.vue +15 -11
  40. package/dist/runtime/components/Edit/Features/Anchors/Renderer.vue +19 -102
  41. package/dist/runtime/components/Edit/Features/Artboard/Renderer.vue +3 -0
  42. package/dist/runtime/components/Edit/Features/BlockAddList/index.vue +29 -53
  43. package/dist/runtime/components/Edit/Features/BlockScheduler/Dialog/ScheduleSection.vue +154 -0
  44. package/dist/runtime/components/Edit/Features/BlockScheduler/Dialog/ScheduleSection.vue.d.ts +27 -0
  45. package/dist/runtime/components/Edit/Features/BlockScheduler/Dialog/index.vue +222 -0
  46. package/dist/runtime/components/Edit/Features/{Selection/AddButtons/AddButtonsField.vue.d.ts → BlockScheduler/Dialog/index.vue.d.ts} +6 -9
  47. package/dist/runtime/components/Edit/Features/BlockScheduler/index.vue +96 -0
  48. package/dist/runtime/components/Edit/Features/Clipboard/index.vue +15 -16
  49. package/dist/runtime/components/Edit/Features/CommandPalette/Palette/Item/index.vue +51 -0
  50. package/dist/runtime/components/Edit/Features/CommandPalette/Palette/{Group → Item}/index.vue.d.ts +9 -13
  51. package/dist/runtime/components/Edit/Features/CommandPalette/Palette/index.vue +46 -66
  52. package/dist/runtime/components/Edit/Features/CommandPalette/index.vue +2 -0
  53. package/dist/runtime/components/Edit/Features/Comments/AddForm/index.vue +35 -20
  54. package/dist/runtime/components/Edit/Features/Comments/AddForm/index.vue.d.ts +5 -3
  55. package/dist/runtime/components/Edit/Features/Comments/CommentInput/index.vue +29 -0
  56. package/dist/runtime/components/Edit/Features/{Publish/Dialog/ScheduleDate.vue.d.ts → Comments/CommentInput/index.vue.d.ts} +2 -2
  57. package/dist/runtime/components/Edit/Features/Comments/Overlay/Item/index.vue +22 -16
  58. package/dist/runtime/components/Edit/Features/Comments/Overlay/Item/index.vue.d.ts +1 -0
  59. package/dist/runtime/components/Edit/Features/Comments/Overlay/index.vue +15 -6
  60. package/dist/runtime/components/Edit/Features/Comments/index.vue +21 -9
  61. package/dist/runtime/components/Edit/Features/Conversions/index.vue +4 -7
  62. package/dist/runtime/components/Edit/Features/Debug/Rects/index.vue +26 -35
  63. package/dist/runtime/components/Edit/Features/Debug/Renderer.vue +240 -0
  64. package/dist/runtime/components/Edit/Features/Debug/Renderer.vue.d.ts +6 -0
  65. package/dist/runtime/components/Edit/Features/Debug/index.vue +7 -165
  66. package/dist/runtime/components/Edit/Features/Delete/index.vue +1 -1
  67. package/dist/runtime/components/Edit/Features/DraggingOverlay/DragItems/index.vue +14 -6
  68. package/dist/runtime/components/Edit/Features/DraggingOverlay/DropTargets/index.vue +55 -48
  69. package/dist/runtime/components/Edit/Features/DraggingOverlay/index.vue +30 -18
  70. package/dist/runtime/components/Edit/Features/Duplicate/index.vue +6 -8
  71. package/dist/runtime/components/Edit/Features/Edit/index.vue +16 -22
  72. package/dist/runtime/components/Edit/Features/EditForm/index.vue +7 -6
  73. package/dist/runtime/components/Edit/Features/EditableField/Overlay/Frame/index.vue +69 -4
  74. package/dist/runtime/components/Edit/Features/EditableField/Overlay/Frame/index.vue.d.ts +2 -2
  75. package/dist/runtime/components/Edit/Features/EditableField/Overlay/Plaintext/index.vue +13 -9
  76. package/dist/runtime/components/Edit/Features/EditableField/Overlay/index.vue +45 -87
  77. package/dist/runtime/components/Edit/Features/EditableField/Overlay/index.vue.d.ts +2 -2
  78. package/dist/runtime/components/Edit/Features/EditableField/index.vue +41 -43
  79. package/dist/runtime/components/Edit/Features/Fragments/Dialog/index.vue +11 -9
  80. package/dist/runtime/components/Edit/Features/Fragments/index.vue +3 -3
  81. package/dist/runtime/components/Edit/Features/History/index.vue +5 -2
  82. package/dist/runtime/components/Edit/Features/Hover/Overlay/fragment.glsl +139 -0
  83. package/dist/runtime/components/Edit/Features/Hover/Overlay/index.vue +261 -0
  84. package/dist/runtime/components/Edit/Features/Hover/Overlay/index.vue.d.ts +6 -0
  85. package/dist/runtime/components/Edit/Features/Hover/Overlay/vertex.glsl +117 -0
  86. package/dist/runtime/components/Edit/Features/Hover/index.vue +25 -0
  87. package/dist/runtime/components/Edit/Features/Hover/index.vue.d.ts +2 -0
  88. package/dist/runtime/components/Edit/Features/Library/EditReusable/index.vue +5 -7
  89. package/dist/runtime/components/Edit/Features/Library/LibraryDialog/index.vue +19 -27
  90. package/dist/runtime/components/Edit/Features/Library/ReusableDialog/index.vue +32 -28
  91. package/dist/runtime/components/Edit/Features/Library/index.vue +28 -23
  92. package/dist/runtime/components/Edit/Features/MediaLibrary/Library/index.vue +6 -3
  93. package/dist/runtime/components/Edit/Features/MediaLibrary/index.vue +15 -12
  94. package/dist/runtime/components/Edit/Features/MultiSelect/Overlay/index.vue +36 -29
  95. package/dist/runtime/components/Edit/Features/MultiSelect/index.vue +2 -4
  96. package/dist/runtime/components/Edit/Features/Options/Form/Item.vue +6 -1
  97. package/dist/runtime/components/Edit/Features/Options/Form/index.vue +8 -6
  98. package/dist/runtime/components/Edit/Features/Options/index.vue +6 -6
  99. package/dist/runtime/components/Edit/Features/Ownership/Renderer.vue +35 -0
  100. package/dist/runtime/components/Edit/Features/Ownership/Renderer.vue.d.ts +6 -0
  101. package/dist/runtime/components/Edit/Features/Ownership/index.vue +7 -25
  102. package/dist/runtime/components/Edit/Features/ProxyView/index.vue +5 -1
  103. package/dist/runtime/components/Edit/Features/Publish/Dialog/index.vue +68 -15
  104. package/dist/runtime/components/Edit/Features/Search/Overlay/Results/Page/index.vue +15 -15
  105. package/dist/runtime/components/Edit/Features/Search/index.vue +4 -1
  106. package/dist/runtime/components/Edit/Features/Selection/AddButtons/Overlay/index.vue +39 -74
  107. package/dist/runtime/components/Edit/Features/Selection/AddButtons/Overlay/index.vue.d.ts +7 -5
  108. package/dist/runtime/components/Edit/Features/Selection/AddButtons/Renderer/fragment.glsl +106 -0
  109. package/dist/runtime/components/Edit/Features/Selection/AddButtons/Renderer/index.vue +440 -0
  110. package/dist/runtime/components/Edit/Features/Selection/AddButtons/Renderer/index.vue.d.ts +32 -0
  111. package/dist/runtime/components/Edit/Features/Selection/AddButtons/Renderer/vertex.glsl +102 -0
  112. package/dist/runtime/components/Edit/Features/Selection/AddButtons/index.vue +53 -125
  113. package/dist/runtime/components/Edit/Features/Selection/AddButtons/index.vue.d.ts +2 -2
  114. package/dist/runtime/components/Edit/Features/Selection/Overlay/index.vue +88 -29
  115. package/dist/runtime/components/Edit/Features/Selection/Overlay/index.vue.d.ts +5 -3
  116. package/dist/runtime/components/Edit/Features/Selection/Overlay/vertex.glsl +11 -2
  117. package/dist/runtime/components/Edit/Features/Selection/OverlayFallback/index.vue +2 -2
  118. package/dist/runtime/components/Edit/Features/Selection/index.vue +66 -39
  119. package/dist/runtime/components/Edit/Features/Structure/List/Field/index.vue +2 -2
  120. package/dist/runtime/components/Edit/Features/Structure/List/Item/index.vue +13 -6
  121. package/dist/runtime/components/Edit/Features/Tour/Overlay/index.vue +3 -0
  122. package/dist/runtime/components/Edit/Features/Transform/index.vue +2 -27
  123. package/dist/runtime/components/Edit/Features/Translations/Banner/index.vue +17 -11
  124. package/dist/runtime/components/Edit/Features/Translations/index.vue +20 -23
  125. package/dist/runtime/components/Edit/Features/Validations/SidebarItem/index.vue +5 -5
  126. package/dist/runtime/components/Edit/Features/index.vue +17 -7
  127. package/dist/runtime/components/Edit/Form/Text/index.vue +2 -1
  128. package/dist/runtime/components/Edit/Form/Text/index.vue.d.ts +1 -0
  129. package/dist/runtime/components/Edit/Form/Toggle/index.vue +4 -3
  130. package/dist/runtime/components/Edit/Form/Toggle/index.vue.d.ts +12 -2
  131. package/dist/runtime/components/Edit/Indicators/index.vue +1 -1
  132. package/dist/runtime/components/Edit/InfoBox/index.vue +6 -2
  133. package/dist/runtime/components/Edit/InfoBox/index.vue.d.ts +12 -2
  134. package/dist/runtime/components/Edit/Konami/Game/index.vue +5 -5
  135. package/dist/runtime/components/Edit/{Features/Publish/Dialog/ScheduleDate.vue → ScheduleDate/index.vue} +6 -58
  136. package/dist/runtime/components/Edit/ScheduleDate/index.vue.d.ts +23 -0
  137. package/dist/runtime/components/Edit/ShortcutIndicator/index.vue +3 -0
  138. package/dist/runtime/components/Edit/Transition/Height.vue +95 -0
  139. package/dist/runtime/components/Edit/Transition/Height.vue.d.ts +36 -0
  140. package/dist/runtime/components/Edit/index.d.ts +7 -3
  141. package/dist/runtime/components/Edit/index.js +12 -4
  142. package/dist/runtime/composables/defineBlokkli.js +4 -2
  143. package/dist/runtime/css/output.css +1 -1
  144. package/dist/runtime/helpers/animationProvider.d.ts +35 -1
  145. package/dist/runtime/helpers/animationProvider.js +179 -48
  146. package/dist/runtime/helpers/composables/defineRenderer.d.ts +8 -0
  147. package/dist/runtime/helpers/composables/defineRenderer.js +8 -0
  148. package/dist/runtime/helpers/composables/useStateBasedCache.d.ts +4 -0
  149. package/dist/runtime/helpers/composables/useStateBasedCache.js +13 -0
  150. package/dist/runtime/helpers/composables/useStickyToolbar.d.ts +4 -1
  151. package/dist/runtime/helpers/composables/useStickyToolbar.js +53 -35
  152. package/dist/runtime/helpers/definitionProvider.d.ts +1 -1
  153. package/dist/runtime/helpers/dom/index.d.ts +1 -0
  154. package/dist/runtime/helpers/domProvider.d.ts +54 -14
  155. package/dist/runtime/helpers/domProvider.js +168 -134
  156. package/dist/runtime/helpers/index.d.ts +1 -8
  157. package/dist/runtime/helpers/index.js +1 -84
  158. package/dist/runtime/helpers/providers/blocks.d.ts +10 -0
  159. package/dist/runtime/helpers/providers/blocks.js +91 -0
  160. package/dist/runtime/helpers/providers/directive.d.ts +24 -0
  161. package/dist/runtime/helpers/providers/directive.js +205 -0
  162. package/dist/runtime/helpers/providers/element.d.ts +6 -0
  163. package/dist/runtime/helpers/providers/element.js +35 -0
  164. package/dist/runtime/helpers/providers/fields.d.ts +8 -0
  165. package/dist/runtime/helpers/providers/fields.js +47 -0
  166. package/dist/runtime/helpers/selectionProvider.d.ts +11 -11
  167. package/dist/runtime/helpers/selectionProvider.js +38 -45
  168. package/dist/runtime/helpers/stateProvider.d.ts +7 -2
  169. package/dist/runtime/helpers/stateProvider.js +83 -14
  170. package/dist/runtime/helpers/storageProvider.d.ts +3 -2
  171. package/dist/runtime/helpers/storageProvider.js +6 -2
  172. package/dist/runtime/helpers/symbols.d.ts +1 -0
  173. package/dist/runtime/helpers/symbols.js +1 -0
  174. package/dist/runtime/helpers/themeProvider.d.ts +2 -1
  175. package/dist/runtime/helpers/themeProvider.js +24 -14
  176. package/dist/runtime/helpers/typesProvider.js +10 -26
  177. package/dist/runtime/helpers/uiProvider.d.ts +11 -3
  178. package/dist/runtime/helpers/uiProvider.js +45 -17
  179. package/dist/runtime/icons/calendar.svg +1 -0
  180. package/dist/runtime/icons/clock.svg +1 -0
  181. package/dist/runtime/icons/comment_add.svg +1 -5
  182. package/dist/runtime/icons/delete.svg +1 -8
  183. package/dist/runtime/icons/duplicate.svg +1 -12
  184. package/dist/runtime/icons/edit.svg +1 -8
  185. package/dist/runtime/icons/reusable.svg +1 -5
  186. package/dist/runtime/plugins/blokkliDirectives.js +96 -0
  187. package/dist/runtime/types/index.d.ts +66 -35
  188. package/package.json +1 -1
  189. package/dist/runtime/components/Edit/DragInteractions/index.vue +0 -401
  190. package/dist/runtime/components/Edit/Features/CommandPalette/Palette/Group/index.vue +0 -63
  191. package/dist/runtime/components/Edit/Features/Selection/AddButtons/AddButtonsField.vue +0 -54
  192. package/dist/runtime/plugins/blokkliEditable.js +0 -31
  193. /package/dist/runtime/components/Edit/{DragInteractions → Features/BlockScheduler}/index.vue.d.ts +0 -0
  194. /package/dist/runtime/plugins/{blokkliEditable.d.ts → blokkliDirectives.d.ts} +0 -0
@@ -18,14 +18,19 @@
18
18
  />
19
19
  </div>
20
20
  <div class="bk-command-palette-results bk-scrollbar-dark">
21
- <Group
22
- :commands="items"
23
- :visible-ids="visibleIds"
24
- :focused-id="focusedId"
25
- @close="$emit('close')"
26
- @focus="onFocus"
27
- @select="onSelect($event)"
28
- />
21
+ <div class="bk-command-palette-results-list">
22
+ <div>
23
+ <Item
24
+ v-for="(item, index) in visibleCommands"
25
+ :key="item.id"
26
+ :item="item"
27
+ :index="index"
28
+ :is-focused="focusedIndex === index"
29
+ @focus="onFocus"
30
+ @select="onSelect"
31
+ />
32
+ </div>
33
+ </div>
29
34
  </div>
30
35
  </ScrollBoundary>
31
36
  </template>
@@ -38,23 +43,24 @@ import {
38
43
  useBlokkli,
39
44
  watch,
40
45
  nextTick,
41
- onBeforeUnmount
46
+ onBeforeUnmount,
47
+ useTemplateRef
42
48
  } from "#imports";
43
49
  import { Icon, ScrollBoundary } from "#blokkli/components";
44
- import Group from "./Group/index.vue";
45
- import { falsy } from "#blokkli/helpers";
46
50
  import { Fzf } from "fzf";
51
+ import { modulo } from "#blokkli/helpers";
52
+ import Item from "./Item/index.vue";
47
53
  const { commands, $t, selection } = useBlokkli();
48
54
  const emit = defineEmits(["close"]);
49
- const inputEl = ref(null);
55
+ const inputEl = useTemplateRef("inputEl");
50
56
  const text = ref("");
51
- const focusedId = ref("");
57
+ const focusedIndex = ref(0);
52
58
  const hasUsedMouse = ref(false);
53
- function onFocus(id) {
59
+ function onFocus(index) {
54
60
  if (!hasUsedMouse.value) {
55
61
  return;
56
62
  }
57
- focusedId.value = id;
63
+ focusedIndex.value = index;
58
64
  }
59
65
  const items = computed(
60
66
  () => commands.getCommands().filter((v) => !v.disabled).map((doc, index) => {
@@ -65,8 +71,6 @@ const items = computed(
65
71
  })
66
72
  );
67
73
  const fzf = new Fzf(items.value, {
68
- // With selector you tell FZF where it can find
69
- // the string that you want to query on
70
74
  selector: (item) => item.label
71
75
  });
72
76
  const visibleIds = computed(
@@ -84,6 +88,16 @@ const visibleIds = computed(
84
88
  }).sort((a, b) => b.score - a.score);
85
89
  }
86
90
  );
91
+ const visibleCommands = computed(() => {
92
+ return items.value.map((v) => {
93
+ const found = visibleIds.value?.find((w) => w.id === v._id);
94
+ return {
95
+ ...v,
96
+ visible: visibleIds.value === void 0 || !!found,
97
+ positions: found?.positions
98
+ };
99
+ }).filter((v) => v.visible);
100
+ });
87
101
  watch(text, () => {
88
102
  nextTick(() => {
89
103
  focusFirst();
@@ -91,62 +105,25 @@ watch(text, () => {
91
105
  });
92
106
  watch(selection.uuids, () => emit("close"));
93
107
  const focusFirst = () => {
94
- const element = document.querySelector(
95
- '.bk-command-palette .bk-command[data-command-visible="true"]'
96
- );
97
- if (element instanceof HTMLElement) {
98
- focusedId.value = element.dataset.commandId || "";
99
- }
100
- };
101
- const getCommandElements = () => {
102
- return [
103
- ...document.querySelectorAll(
104
- '.bk-command-palette .bk-command[data-command-visible="true"]'
105
- )
106
- ].map((el) => {
107
- if (el instanceof HTMLElement) {
108
- const id = el.dataset.commandId;
109
- if (id) {
110
- return {
111
- id,
112
- el,
113
- focused: focusedId.value === id
114
- };
115
- }
116
- }
117
- }).filter(falsy);
108
+ focusedIndex.value = 0;
118
109
  };
119
110
  const focusPrev = () => {
120
- const elements = getCommandElements();
121
- if (elements.length === 0) {
111
+ if (visibleCommands.value.length === 0) {
122
112
  return;
123
113
  }
124
- const focusedIndex = elements.findIndex((v) => v.focused);
125
- if (focusedIndex <= 0) {
126
- focusedId.value = elements[elements.length - 1].id;
127
- } else {
128
- focusedId.value = elements[focusedIndex - 1].id;
129
- }
130
- scrollFocusedIntoView();
114
+ focusedIndex.value = modulo(
115
+ focusedIndex.value - 1,
116
+ visibleCommands.value.length
117
+ );
131
118
  };
132
119
  const focusNext = () => {
133
- const elements = getCommandElements();
134
- if (elements.length === 0) {
120
+ if (visibleCommands.value.length === 0) {
135
121
  return;
136
122
  }
137
- const focusedIndex = elements.findIndex((v) => v.focused);
138
- if (focusedIndex === -1 || focusedIndex === elements.length - 1) {
139
- focusedId.value = elements[0].id;
140
- } else {
141
- focusedId.value = elements[focusedIndex + 1].id;
142
- }
143
- scrollFocusedIntoView();
144
- };
145
- const scrollFocusedIntoView = () => {
146
- const element = getCommandElements().find((v) => v.focused)?.el;
147
- if (element) {
148
- element.scrollIntoView({ block: "nearest", inline: "nearest" });
149
- }
123
+ focusedIndex.value = modulo(
124
+ focusedIndex.value + 1,
125
+ visibleCommands.value.length
126
+ );
150
127
  };
151
128
  const onSelect = (id) => {
152
129
  const command = items.value.find((v) => v.id === id);
@@ -177,7 +154,10 @@ const onKeyDown = (e) => {
177
154
  focusPrev();
178
155
  } else if (e.code === "Enter") {
179
156
  e.preventDefault();
180
- onSelect(focusedId.value);
157
+ const command = visibleCommands.value[focusedIndex.value];
158
+ if (command) {
159
+ onSelect(command.id);
160
+ }
181
161
  } else if (e.code === "Escape") {
182
162
  e.preventDefault();
183
163
  emit("close");
@@ -28,6 +28,7 @@ import { useBlokkli, defineBlokkliFeature, ref, computed } from "#imports";
28
28
  import { PluginToolbarButton } from "#blokkli/plugins";
29
29
  import { BlokkliTransition } from "#blokkli/components";
30
30
  import Palette from "./Palette/index.vue";
31
+ import onBlokkliEvent from "#blokkli/helpers/composables/onBlokkliEvent";
31
32
  defineBlokkliFeature({
32
33
  id: "command-palette",
33
34
  icon: "command",
@@ -38,6 +39,7 @@ defineBlokkliFeature({
38
39
  const { $t } = useBlokkli();
39
40
  const isVisible = ref(false);
40
41
  const label = computed(() => $t("commandPaletteOpen", "Open Command Palette"));
42
+ onBlokkliEvent("window:clickAway", () => isVisible.value = false);
41
43
  </script>
42
44
 
43
45
  <script>
@@ -1,29 +1,44 @@
1
1
  <template>
2
- <div class="bk-blokkli-item-actions-comment-dropdown" @keydown.capture.stop>
3
- <label for="comment_body" class="bk-form-label">{{
4
- $t("commentBody", "Comment")
5
- }}</label>
6
- <textarea
7
- id="comment_body"
8
- v-model="comment"
9
- type="text"
10
- class="bk-form-input"
11
- rows="5"
12
- required
13
- />
14
- <button class="bk-button bk-is-primary" @click="$emit('add', comment)">
15
- {{ $t("commentSave", "Submit comment") }}
16
- </button>
17
- </div>
2
+ <ArtboardTooltip
3
+ id="add-comment"
4
+ :title="$t('addCommentHeader', 'Add Comment')"
5
+ class="bk-add-comment"
6
+ @close="$emit('close')"
7
+ >
8
+ <div class="bk-add-comment-inner" @keydown.capture.stop>
9
+ <CommentInput id="comment_body" v-model="comment" />
10
+ <footer>
11
+ <button
12
+ :disabled="!comment"
13
+ class="bk-button bk-is-warning"
14
+ @click.prevent="onAdd"
15
+ >
16
+ {{ $t("commentSave", "Submit comment") }}
17
+ </button>
18
+ </footer>
19
+ </div>
20
+ </ArtboardTooltip>
18
21
  </template>
19
22
 
20
23
  <script setup>
21
- import { ref, useBlokkli } from "#imports";
22
- const comment = ref("");
23
- defineEmits(["add"]);
24
- const { $t } = useBlokkli();
24
+ import { onBeforeUnmount, onMounted, useBlokkli } from "#imports";
25
+ import { ArtboardTooltip } from "#blokkli/components";
26
+ import CommentInput from "./../CommentInput/index.vue";
27
+ const emit = defineEmits(["add", "close"]);
28
+ const { $t, ui, storage } = useBlokkli();
29
+ const comment = storage.useWithContextPrefix("commentAddText", "");
25
30
  const getComment = () => {
26
31
  return comment.value;
27
32
  };
33
+ function onAdd() {
34
+ emit("add", comment.value);
35
+ comment.value = "";
36
+ }
28
37
  defineExpose({ getComment });
38
+ onMounted(() => {
39
+ ui.setSelectionColor("add-comment", "yellow");
40
+ });
41
+ onBeforeUnmount(() => {
42
+ ui.removeSelectionColor("add-comment");
43
+ });
29
44
  </script>
@@ -1,8 +1,10 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
2
  getComment: () => string;
3
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
4
- add: (...args: any[]) => void;
3
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
4
+ close: () => any;
5
+ add: (comment: string) => any;
5
6
  }, string, import("vue").PublicProps, Readonly<{}> & Readonly<{
6
- onAdd?: ((...args: any[]) => any) | undefined;
7
+ onClose?: (() => any) | undefined;
8
+ onAdd?: ((comment: string) => any) | undefined;
7
9
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
8
10
  export default _default;
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <div class="bk-comment-textarea">
3
+ <textarea
4
+ id="comment_body"
5
+ ref="textarea"
6
+ v-model="value"
7
+ type="text"
8
+ class="bk-form-input"
9
+ rows="4"
10
+ :placeholder
11
+ required
12
+ />
13
+ </div>
14
+ </template>
15
+
16
+ <script setup>
17
+ import { onMounted, useTemplateRef } from "#imports";
18
+ defineProps({
19
+ id: { type: String, required: true },
20
+ placeholder: { type: String, required: false }
21
+ });
22
+ const value = defineModel({ type: String });
23
+ const el = useTemplateRef("textarea");
24
+ onMounted(() => {
25
+ if (el.value) {
26
+ el.value.focus();
27
+ }
28
+ });
29
+ </script>
@@ -1,6 +1,6 @@
1
1
  type __VLS_Props = {
2
- disabled?: boolean;
3
- error?: string;
2
+ id: string;
3
+ placeholder?: string;
4
4
  };
5
5
  type __VLS_PublicProps = __VLS_Props & {
6
6
  modelValue?: string;
@@ -13,15 +13,24 @@
13
13
  :class="{
14
14
  'bk-has-unresolved-comments': unresolvedCount > 0
15
15
  }"
16
- @click="$emit('toggle')"
16
+ @click.prevent="$emit('toggle')"
17
+ @pointerdown.prevent.stop
18
+ @pointerup.prevent.stop
19
+ @pointermove.prevent.stop
17
20
  >
18
21
  <Icon v-if="showComments" name="close" />
19
22
  <span v-else>{{ unresolvedCount }}</span>
20
23
  </button>
21
24
  <div
22
- v-show="showComments"
25
+ v-if="showComments"
23
26
  class="bk-comments-overlay-comments"
24
27
  :class="{ 'bk-is-left': isLeft, 'bk-is-right': !isLeft }"
28
+ :style="{
29
+ width: width + 'px'
30
+ }"
31
+ @pointerdown.capture.stop
32
+ @pointerup.capture.stop
33
+ @pointermove.capture.stop
25
34
  >
26
35
  <div class="bk-comments-overlay-comments-header">
27
36
  <Icon name="comment" />
@@ -36,17 +45,14 @@
36
45
  <Comment v-bind="comment" @resolve="resolveComment(comment.uuid)" />
37
46
  </div>
38
47
  <div class="bk-comments-overlay-form" @keydown.capture.stop>
39
- <textarea
40
- v-model="commentText"
41
- type="text"
42
- class="bk-form-input"
48
+ <CommentInput
49
+ id="comment_reply"
50
+ v-model.lazy="commentText"
43
51
  :placeholder="$t('commentBodyPlaceholder', 'Add reply')"
44
- required
45
- @focus="showFullForm = true"
46
52
  />
47
53
  <button
48
- v-if="showFullForm && commentText"
49
- class="bk-button bk-is-primary bk-is-small"
54
+ v-if="commentText"
55
+ class="bk-button bk-is-warning"
50
56
  @click="addComment"
51
57
  >
52
58
  {{ $t("commentAdd", "Add comment") }}
@@ -57,12 +63,12 @@
57
63
  </template>
58
64
 
59
65
  <script setup>
60
- import { ref, computed, useBlokkli } from "#imports";
66
+ import { computed, useBlokkli } from "#imports";
61
67
  import { Icon } from "#blokkli/components";
62
68
  import Comment from "./../../Comment/index.vue";
63
- const { $t } = useBlokkli();
64
- const commentText = ref("");
65
- const showFullForm = ref(false);
69
+ import CommentInput from "./../../CommentInput/index.vue";
70
+ const { $t, storage } = useBlokkli();
71
+ const commentText = storage.useWithContextPrefix("commentReply", "");
66
72
  const emit = defineEmits(["toggle", "addComment", "resolveComment"]);
67
73
  const props = defineProps({
68
74
  isReduced: { type: Boolean, required: true },
@@ -70,14 +76,14 @@ const props = defineProps({
70
76
  uuids: { type: Array, required: true },
71
77
  comments: { type: Array, required: true },
72
78
  style: { type: null, required: true },
73
- showComments: { type: Boolean, required: true }
79
+ showComments: { type: Boolean, required: true },
80
+ width: { type: Number, required: true }
74
81
  });
75
82
  const unresolvedCount = computed(
76
83
  () => props.comments.filter((v) => !v.resolved).length
77
84
  );
78
85
  function addComment() {
79
86
  emit("addComment", commentText.value);
80
- showFullForm.value = false;
81
87
  commentText.value = "";
82
88
  }
83
89
  function resolveComment(uuid) {
@@ -6,6 +6,7 @@ type __VLS_Props = {
6
6
  comments: CommentItem[];
7
7
  style: any;
8
8
  showComments: boolean;
9
+ width: number;
9
10
  };
10
11
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
11
12
  toggle: () => void;
@@ -1,13 +1,14 @@
1
1
  <template>
2
- <Teleport to="body">
3
- <div class="bk bk-comments-overlay bk-control">
2
+ <Teleport to="#bk-canvas-overlay">
3
+ <div ref="overlay" class="bk bk-comments-overlay bk-control">
4
4
  <Item
5
5
  v-for="item in indicators"
6
6
  :key="item.id"
7
7
  v-bind="item"
8
- :is-reduced="isReduced"
9
- :is-left="isLeft"
8
+ :is-reduced
9
+ :is-left
10
10
  :show-comments="active === item.id"
11
+ :width
11
12
  @toggle="toggle(item)"
12
13
  @add-comment="$emit('addComment', { body: $event, uuids: item.uuids })"
13
14
  @resolve-comment="$emit('resolveComment', $event)"
@@ -17,11 +18,19 @@
17
18
  </template>
18
19
 
19
20
  <script setup>
20
- import { ref, useBlokkli } from "#imports";
21
+ import { computed, ref, useBlokkli } from "#imports";
21
22
  import { falsy, getBounds } from "#blokkli/helpers";
22
23
  import Item from "./Item/index.vue";
23
24
  import onBlokkliEvent from "#blokkli/helpers/composables/onBlokkliEvent";
24
25
  const { eventBus, ui, dom } = useBlokkli();
26
+ const width = computed(() => {
27
+ if (ui.viewport.value.width > 1600) {
28
+ return 400;
29
+ } else if (ui.viewport.value.width > 1300) {
30
+ return 350;
31
+ }
32
+ return 300;
33
+ });
25
34
  const props = defineProps({
26
35
  comments: { type: Array, required: true }
27
36
  });
@@ -47,7 +56,7 @@ onBlokkliEvent("canvas:draw", (e) => {
47
56
  ui.visibleViewportPadded.value.x + ui.visibleViewportPadded.value.width - 30
48
57
  );
49
58
  isReduced.value = scale < 0.8;
50
- isLeft.value = x + 300 < ui.visibleViewportPadded.value.x + ui.visibleViewportPadded.value.width;
59
+ isLeft.value = x + width.value < ui.visibleViewportPadded.value.x + ui.visibleViewportPadded.value.width;
51
60
  const newIndicators = {};
52
61
  const yMap = /* @__PURE__ */ new Set();
53
62
  const findY = (y) => {
@@ -19,6 +19,7 @@
19
19
  </li>
20
20
  </ul>
21
21
  </div>
22
+
22
23
  <template v-if="unresolvedCount" #badge>
23
24
  <div class="bk-sidebar-badge bk-is-yellow">{{ unresolvedCount }}</div>
24
25
  </template>
@@ -26,17 +27,24 @@
26
27
 
27
28
  <PluginItemAction
28
29
  id="add_comment"
29
- :title="$t('addCommentToItem', 'Comment')"
30
+ :title="$t('addCommentToItem', 'Add Comment...')"
30
31
  :active="showAddComment"
31
32
  weight="last"
32
- icon="comment"
33
+ icon="comment_add"
33
34
  multiple
34
35
  @click="showAddComment = !showAddComment"
35
- >
36
- <template v-if="showAddComment" #default="{ uuids }">
37
- <CommentAddForm ref="commentForm" @add="onAddComment($event, uuids)" />
38
- </template>
39
- </PluginItemAction>
36
+ />
37
+
38
+ <Teleport to="body">
39
+ <BlokkliTransition name="caret-tooltip">
40
+ <CommentAddForm
41
+ v-if="showAddComment"
42
+ ref="commentForm"
43
+ @add="onAddComment($event)"
44
+ @close="showAddComment = false"
45
+ />
46
+ </BlokkliTransition>
47
+ </Teleport>
40
48
 
41
49
  <CommentsOverlay
42
50
  v-if="comments.length"
@@ -55,6 +63,7 @@ import {
55
63
  computed
56
64
  } from "#imports";
57
65
  import { PluginSidebar, PluginItemAction } from "#blokkli/plugins";
66
+ import { BlokkliTransition } from "#blokkli/components";
58
67
  import Comment from "./Comment/index.vue";
59
68
  import CommentAddForm from "./AddForm/index.vue";
60
69
  import CommentsOverlay from "./Overlay/index.vue";
@@ -79,8 +88,11 @@ comments.value = await adapter.loadComments();
79
88
  const unresolvedCount = computed(
80
89
  () => comments.value.filter((v) => !v.resolved).length
81
90
  );
82
- const onAddComment = async (body, uuids) => {
83
- comments.value = await adapter.addComment(uuids, body);
91
+ const onAddComment = async (body, providedUuids) => {
92
+ const uuids = providedUuids ?? [...selection.uuids.value];
93
+ if (uuids.length) {
94
+ comments.value = await adapter.addComment(uuids, body);
95
+ }
84
96
  showAddComment.value = false;
85
97
  };
86
98
  const onResolveComment = async (uuid) => {
@@ -18,7 +18,7 @@ import {
18
18
  watch
19
19
  } from "#imports";
20
20
  import { PluginItemDropdown } from "#blokkli/plugins";
21
- import { falsy, onlyUnique } from "#blokkli/helpers";
21
+ import { falsy } from "#blokkli/helpers";
22
22
  const { adapter } = defineBlokkliFeature({
23
23
  id: "conversions",
24
24
  label: "Conversions",
@@ -46,20 +46,17 @@ async function onConvert(targetBundle) {
46
46
  }
47
47
  await state.mutateWithLoadingState(
48
48
  () => adapter.convertBlocks(
49
- selection.blocks.value.map((v) => v.uuid),
49
+ selection.items.value.map((v) => v.uuid),
50
50
  targetBundle
51
51
  ),
52
52
  $t("failedToConvert", "The block could not be converted.")
53
53
  );
54
54
  }
55
- const itemBundleIds = computed(
56
- () => selection.blocks.value.map((v) => v.itemBundle).filter(onlyUnique)
57
- );
58
55
  const possibleConversions = computed(() => {
59
- if (itemBundleIds.value.length !== 1) {
56
+ if (selection.bundles.value.length !== 1) {
60
57
  return [];
61
58
  }
62
- const sourceType = itemBundleIds.value[0];
59
+ const sourceType = selection.bundles.value[0];
63
60
  const titleBase = $t("conversionsConvertTo", "Convert to: @bundle");
64
61
  return conversions.value.filter(
65
62
  (v) => v.sourceBundle === sourceType && types.allowedTypesInList.value.includes(v.targetBundle)
@@ -12,10 +12,26 @@
12
12
 
13
13
  <script setup>
14
14
  import { useBlokkli, ref } from "#imports";
15
- import { intersects } from "#blokkli/helpers";
15
+ import { falsy, intersects } from "#blokkli/helpers";
16
16
  import onBlokkliEvent from "#blokkli/helpers/composables/onBlokkliEvent";
17
- const { ui, dom } = useBlokkli();
17
+ const { ui, dom, directive } = useBlokkli();
18
18
  const canvasRects = ref(null);
19
+ function drawRects(ctx, rects, scale, offset, viewport) {
20
+ for (let i = 0; i < rects.length; i++) {
21
+ const rect = rects[i];
22
+ const drawnRect = {
23
+ x: rect.x * scale + offset.x,
24
+ y: rect.y * scale + offset.y,
25
+ width: rect.width * scale,
26
+ height: rect.height * scale
27
+ };
28
+ if (intersects(drawnRect, viewport)) {
29
+ ctx.beginPath();
30
+ ctx.rect(drawnRect.x, drawnRect.y, drawnRect.width, drawnRect.height);
31
+ ctx.stroke();
32
+ }
33
+ }
34
+ }
19
35
  onBlokkliEvent("canvas:draw", (e) => {
20
36
  if (!canvasRects.value) {
21
37
  return;
@@ -31,39 +47,14 @@ onBlokkliEvent("canvas:draw", (e) => {
31
47
  const blockRects = dom.getBlockRects();
32
48
  const viewport = ui.visibleViewport.value;
33
49
  const rects = Object.values(blockRects);
34
- for (let i = 0; i < rects.length; i++) {
35
- const rect = rects[i];
36
- const drawnRect = {
37
- x: rect.x * e.artboardScale + e.artboardOffset.x,
38
- y: rect.y * e.artboardScale + e.artboardOffset.y,
39
- width: rect.width * e.artboardScale,
40
- height: rect.height * e.artboardScale
41
- };
42
- if (intersects(drawnRect, viewport)) {
43
- ctx.beginPath();
44
- ctx.rect(drawnRect.x, drawnRect.y, drawnRect.width, drawnRect.height);
45
- ctx.stroke();
46
- }
47
- }
50
+ drawRects(ctx, rects, e.artboardScale, e.artboardOffset, viewport);
48
51
  ctx.strokeStyle = "red";
49
- const visibleFieldRects = dom.getVisibleFields();
50
- for (let i = 0; i < visibleFieldRects.length; i++) {
51
- const key = visibleFieldRects[i];
52
- const rect = dom.getFieldRect(key);
53
- if (!rect) {
54
- continue;
55
- }
56
- const drawnRect = {
57
- x: rect.x * e.artboardScale + e.artboardOffset.x,
58
- y: rect.y * e.artboardScale + e.artboardOffset.y,
59
- width: rect.width * e.artboardScale,
60
- height: rect.height * e.artboardScale
61
- };
62
- if (intersects(drawnRect, viewport)) {
63
- ctx.beginPath();
64
- ctx.rect(drawnRect.x, drawnRect.y, drawnRect.width, drawnRect.height);
65
- ctx.stroke();
66
- }
67
- }
52
+ const visibleFieldRects = dom.getVisibleFields().map((key) => {
53
+ return dom.getFieldRect(key);
54
+ }).filter(falsy);
55
+ drawRects(ctx, visibleFieldRects, e.artboardScale, e.artboardOffset, viewport);
56
+ ctx.strokeStyle = "green";
57
+ const editableRects = directive.getVisible("editable");
58
+ drawRects(ctx, editableRects, e.artboardScale, e.artboardOffset, viewport);
68
59
  });
69
60
  </script>