Browse Source

feat: press `Space` to select an element

Ahmad Kholid 2 years ago
parent
commit
28d8196c81

+ 30 - 0
src/components/content/shared/SharedElementSelector.vue

@@ -28,6 +28,7 @@
   <teleport to="body">
   <teleport to="body">
     <div
     <div
       v-if="!disabled"
       v-if="!disabled"
+      id="automa-selector-overlay"
       style="
       style="
         z-index: 9999999;
         z-index: 9999999;
         position: fixed;
         position: fixed;
@@ -75,6 +76,10 @@ let frameElement = null;
 let frameElementRect = null;
 let frameElementRect = null;
 let lastScrollPosY = window.scrollY;
 let lastScrollPosY = window.scrollY;
 let lastScrollPosX = window.scrollX;
 let lastScrollPosX = window.scrollX;
+const mousePosition = {
+  x: 0,
+  y: 0,
+};
 
 
 let hoveredElements = [];
 let hoveredElements = [];
 const elementsState = reactive({
 const elementsState = reactive({
@@ -256,8 +261,31 @@ function retrieveElementsRect({ clientX, clientY, target: eventTarget }, type) {
 function onMousemove(event) {
 function onMousemove(event) {
   if (props.pause) return;
   if (props.pause) return;
 
 
+  mousePosition.x = event.clientX;
+  mousePosition.y = event.clientY;
   retrieveElementsRect(event, 'hovered');
   retrieveElementsRect(event, 'hovered');
 }
 }
+function onKeydown(event) {
+  if (props.pause || event.repeat || event.code !== 'Space') return;
+
+  const { 1: selectedElement } = document.elementsFromPoint(
+    mousePosition.x,
+    mousePosition.y
+  );
+  if (selectedElement.id === 'automa-selector-overlay') return;
+
+  event.preventDefault();
+  event.stopPropagation();
+
+  retrieveElementsRect(
+    {
+      target: selectedElement,
+      clientX: mousePosition.x,
+      clientY: mousePosition.y,
+    },
+    'selected'
+  );
+}
 function onClick(event) {
 function onClick(event) {
   retrieveElementsRect(event, 'selected');
   retrieveElementsRect(event, 'selected');
 }
 }
@@ -282,12 +310,14 @@ function attachListeners() {
   window.addEventListener('scroll', onScroll);
   window.addEventListener('scroll', onScroll);
   document.addEventListener('click', onClick);
   document.addEventListener('click', onClick);
   window.addEventListener('message', onMessage);
   window.addEventListener('message', onMessage);
+  document.addEventListener('keydown', onKeydown);
   window.addEventListener('mousemove', onMousemove);
   window.addEventListener('mousemove', onMousemove);
 }
 }
 function detachListeners() {
 function detachListeners() {
   window.removeEventListener('scroll', onScroll);
   window.removeEventListener('scroll', onScroll);
   document.removeEventListener('click', onClick);
   document.removeEventListener('click', onClick);
   window.removeEventListener('message', onMessage);
   window.removeEventListener('message', onMessage);
+  document.removeEventListener('keydown', onKeydown);
   window.removeEventListener('mousemove', onMousemove);
   window.removeEventListener('mousemove', onMousemove);
 }
 }
 
 

+ 7 - 0
src/content/elementSelector/App.vue

@@ -36,12 +36,14 @@
         <div class="flex-grow"></div>
         <div class="flex-grow"></div>
         <button
         <button
           class="mr-2 hoverable p-1 rounded-md transition"
           class="mr-2 hoverable p-1 rounded-md transition"
+          @mousedown.stop.prevent
           @click.stop.prevent="state.hide = !state.hide"
           @click.stop.prevent="state.hide = !state.hide"
         >
         >
           <v-remixicon :name="state.hide ? 'riEyeOffLine' : 'riEyeLine'" />
           <v-remixicon :name="state.hide ? 'riEyeOffLine' : 'riEyeLine'" />
         </button>
         </button>
         <button
         <button
           class="hoverable p-1 rounded-md transition"
           class="hoverable p-1 rounded-md transition"
+          @mousedown.stop.prevent
           @click.stop.prevent="destroy"
           @click.stop.prevent="destroy"
         >
         >
           <v-remixicon name="riCloseLine" />
           <v-remixicon name="riCloseLine" />
@@ -120,6 +122,11 @@
             </li>
             </li>
           </ul>
           </ul>
         </div>
         </div>
+        <p class="mt-1 text-sm text-gray-600">
+          Click or press
+          <kbd class="p-1 rounded-md bg-box-transparent">Space</kbd> to select
+          an element
+        </p>
       </div>
       </div>
     </div>
     </div>
   </div>
   </div>