<pre style='margin:0'>
Zhenfu Shi (i0ntempest) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/8dc50915a4b85daa88e2f84cc1b4421bac21bf1a">https://github.com/macports/macports-ports/commit/8dc50915a4b85daa88e2f84cc1b4421bac21bf1a</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 8dc50915a4b filebrowser: add patch file
</span>8dc50915a4b is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 8dc50915a4b85daa88e2f84cc1b4421bac21bf1a
</span>Author: i0ntempest <i0ntempest@i0ntempest.com>
AuthorDate: Sun Jun 1 14:10:31 2025 +1000

<span style='display:block; white-space:pre;color:#404040;'>    filebrowser: add patch file
</span>---
 net/filebrowser/files/patch-3343.diff | 286 ++++++++++++++++++++++++++++++++++
 1 file changed, 286 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/filebrowser/files/patch-3343.diff b/net/filebrowser/files/patch-3343.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..76d47dd606d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/filebrowser/files/patch-3343.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,286 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/components/ContextMenu.vue b/frontend/src/components/ContextMenu.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0000000000..14663fd9b5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/components/ContextMenu.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,47 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++<template>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  <div
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    class="context-menu"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ref="contextMenu"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    v-show="show"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    :style="{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      top: `${props.pos.y}px`,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      left: `${left}px`,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  >
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    <slot />
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  </div>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++</template>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++<script setup lang="ts">
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import { ref, watch, computed, onUnmounted } from "vue";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const emit = defineEmits(["hide"]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const props = defineProps<{ show: boolean; pos: { x: number; y: number } }>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const contextMenu = ref<HTMLElement | null>(null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const left = computed(() => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return Math.min(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    props.pos.x,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    window.innerWidth - (contextMenu.value?.clientWidth ?? 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++});
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const hideContextMenu = () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  emit("hide");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++watch(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  () => props.show,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  (val) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (val) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      document.addEventListener("click", hideContextMenu);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      document.removeEventListener("click", hideContextMenu);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++onUnmounted(() => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  document.removeEventListener("click", hideContextMenu);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++});
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++</script>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/components/files/ListingItem.vue b/frontend/src/components/files/ListingItem.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 75326f4cfc..932bc4b1dd 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/components/files/ListingItem.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/components/files/ListingItem.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -8,6 +8,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     @dragover="dragOver"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     @drop="drop"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     @click="itemClick"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    @contextmenu="contextMenu"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     :data-dir="isDir"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     :data-type="type"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     :aria-label="name"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -220,6 +221,17 @@ const itemClick = (event: Event | KeyboardEvent) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else click(event);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const contextMenu = (event: MouseEvent) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  event.preventDefault();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    fileStore.selected.length === 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    event.ctrlKey ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    fileStore.selected.indexOf(props.index) === -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    click(event);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const click = (event: Event | KeyboardEvent) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!singleClick.value && fileStore.selectedCount !== 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     event.preventDefault();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/components/prompts/Move.vue b/frontend/src/components/prompts/Move.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6591d09d38..0cb0d59946 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/components/prompts/Move.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/components/prompts/Move.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5,6 +5,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     </div>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     <div class="card-content">
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      <p>{{ $t("prompts.moveMessage") }}</p>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       <file-list
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ref="fileList"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         @update:selected="(val) => (dest = val)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/css/context-menu.css b/frontend/src/css/context-menu.css
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0000000000..cd7913641c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/css/context-menu.css
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.context-menu {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  position: absolute;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  background: var(--surfacePrimary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  min-width: 180px;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  max-width: 220px;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  border: 1px solid var(--borderSecondary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  box-shadow: 0 2px 4px var(--borderPrimary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  z-index: 999;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.context-menu .action {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  display: block;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  width: 100%;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  border-radius: 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  display: flex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  align-items: center;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+\ No newline at end of file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/css/styles.css b/frontend/src/css/styles.css
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 19b94b955b..024b48866c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/css/styles.css
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/css/styles.css
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -17,6 +17,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @import "./mobile.css";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @import "./epubReader.css";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @import "./mdPreview.css";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@import "./context-menu.css";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* For testing only
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  :focus {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -456,4 +457,4 @@ html[dir="rtl"] .card-content .small + input {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ html[dir="rtl"] .card.floating .card-content .file-list {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   direction: ltr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   text-align: left;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+\ No newline at end of file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/views/files/FileListing.vue b/frontend/src/views/files/FileListing.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8fa48f72e0..e5e929e37a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/views/files/FileListing.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/views/files/FileListing.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -208,7 +208,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         <h2 v-if="fileStore.req?.numDirs ?? false">
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           {{ t("files.folders") }}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         </h2>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        <div v-if="fileStore.req?.numDirs ?? false">
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        <div
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          v-if="fileStore.req?.numDirs ?? false"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          @contextmenu="showContextMenu"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        >
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           <item
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             v-for="item in dirs"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             :key="base64(item.name)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -224,8 +227,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           </item>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         </div>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        <h2 v-if="fileStore.req?.numFiles ?? false">{{ t("files.files") }}</h2>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        <div v-if="fileStore.req?.numFiles ?? false">
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        <h2 v-if="fileStore.req?.numFiles ?? false">
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          {{ t("files.files") }}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        </h2>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        <div
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          v-if="fileStore.req?.numFiles ?? false"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          @contextmenu="showContextMenu"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        >
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           <item
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             v-for="item in files"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             :key="base64(item.name)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -240,6 +248,53 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           >
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           </item>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         </div>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        <context-menu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          :show="isContextMenuVisible"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          :pos="contextMenuPos"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          @hide="hideContextMenu"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        >
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          <action
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            v-if="headerButtons.share"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            icon="share"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            :label="t('buttons.share')"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            show="share"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          />
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          <action
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            v-if="headerButtons.rename"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            icon="mode_edit"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            :label="t('buttons.rename')"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            show="rename"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          />
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          <action
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            v-if="headerButtons.copy"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            id="copy-button"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            icon="content_copy"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            :label="t('buttons.copyFile')"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            show="copy"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          />
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          <action
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            v-if="headerButtons.move"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            id="move-button"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            icon="forward"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            :label="t('buttons.moveFile')"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            show="move"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          />
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          <action
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            v-if="headerButtons.delete"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            id="delete-button"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            icon="delete"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            :label="t('buttons.delete')"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            show="delete"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          />
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          <action
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            v-if="headerButtons.download"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            icon="file_download"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            :label="t('buttons.download')"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            @action="download"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            :counter="fileStore.selectedCount"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          />
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          <action icon="info" :label="t('buttons.info')" show="info" />
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        </context-menu>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         <input
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           style="display: none"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -292,6 +347,7 @@ import HeaderBar from "@/components/header/HeaderBar.vue";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import Action from "@/components/header/Action.vue";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import Search from "@/components/Search.vue";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import Item from "@/components/files/ListingItem.vue";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import ContextMenu from "@/components/ContextMenu.vue";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   computed,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   inject,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -310,6 +366,8 @@ const columnWidth = ref<number>(280);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const dragCounter = ref<number>(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const width = ref<number>(window.innerWidth);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const itemWeight = ref<number>(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const isContextMenuVisible = ref<boolean>(false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const contextMenuPos = ref<{ x: number; y: number }>({ x: 0, y: 0 });
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const $showError = inject<IToastError>("$showError")!;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -444,7 +502,7 @@ watch(req, () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ onMounted(() => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Check the columns size for the first time.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  colunmsResize();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  columnsResize();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // How much every listing item affects the window height
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   setItemWeight();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -638,7 +696,7 @@ const paste = (event: Event) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   action(overwrite, rename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-const colunmsResize = () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const columnsResize = () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Update the columns size based on the window width.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const items_ = css(["#listing.mosaic .item", ".mosaic#listing .item"]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (items_ === null) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -841,7 +899,7 @@ const toggleMultipleSelection = () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const windowsResize = throttle(() => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  colunmsResize();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  columnsResize();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   width.value = window.innerWidth;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Listing element is not displayed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -951,4 +1009,17 @@ const fillWindow = (fit = false) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Set the number of displayed items
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   showLimit.value = showQuantity > totalItems ? totalItems : showQuantity;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const showContextMenu = (event: MouseEvent) => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  event.preventDefault();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  isContextMenuVisible.value = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  contextMenuPos.value = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    x: event.clientX + 8,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    y: event.clientY + Math.floor(window.scrollY),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++const hideContextMenu = () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  isContextMenuVisible.value = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ </script>
</span></pre><pre style='margin:0'>

</pre>