From afd372e2360767ba5058b4aba1d00bc852a574a5 Mon Sep 17 00:00:00 2001
From: Julien Touchais <5978-julien.touchais@users.noreply.forgemia.inra.fr>
Date: Mon, 16 Oct 2023 15:43:47 +0200
Subject: [PATCH 1/5] fix: :construction: beginnning of a solution for #16

---
 src/components/SequenceBoard.vue | 42 +++++++++++++++++++++++---------
 1 file changed, 30 insertions(+), 12 deletions(-)

diff --git a/src/components/SequenceBoard.vue b/src/components/SequenceBoard.vue
index b3c0205..4d09d5d 100644
--- a/src/components/SequenceBoard.vue
+++ b/src/components/SequenceBoard.vue
@@ -76,22 +76,13 @@ const sequenceToClipboard = () => {
     </Button>
   </div>
   <div
-    class="sequence-parent grid justify-between gap-x-4 gap-y-2 font-mono text-2xl"
-    :style="{
-      // Highly-dynamic style which can't be handled by Tailwind safelisting
-      // Grid columns width: (1ch + .25rem + 4px) * # of nucleotides in a group
-      gridTemplateColumns: `repeat(auto-fill, min(100%, calc(${nucleotideGroupsSize}ch + ${
-        0.25 * nucleotideGroupsSize
-      }rem + ${4 * nucleotideGroupsSize}px)))`
-    }"
+    class="sequence-parent relative overflow-x-auto overflow-y-hidden pt-4 font-mono text-2xl leading-[4.25rem]"
   >
-    <div
+    <span
       v-for="(sequenceGroup, groupIndex) in splittedSequence"
       :key="groupIndex"
+      class="relative z-10 mr-4 mt-8 whitespace-nowrap"
     >
-      <div class="select-none text-sm text-slate-400">
-        {{ groupIndex * nucleotideGroupsSize + 1 }}
-      </div>
       <span
         v-for="(nucleotide, nucleotideIndex) in sequenceGroup"
         :key="nucleotideIndex"
@@ -113,6 +104,16 @@ const sequenceToClipboard = () => {
       >
         {{ nucleotide }}
       </span>
+    </span>
+    <div class="absolute -top-3 left-0 z-0">
+      <span
+        v-for="(sequenceGroup, groupIndex) in splittedSequence"
+        :key="groupIndex"
+        class="mt-5 inline-block select-none text-lg text-slate-400"
+        :style="{ width: `${nucleotideGroupsSize * 1.5}rem` }"
+      >
+        {{ groupIndex * nucleotideGroupsSize + 1 }}
+      </span>
     </div>
   </div>
 </template>
@@ -126,4 +127,21 @@ const sequenceToClipboard = () => {
     background-color: var(--gray-100);
   }
 }
+
+@-moz-document url-prefix() {
+  .sequence-parent {
+    line-height: normal;
+    padding-top: 0;
+    > span {
+      display: inline-block;
+    }
+
+    > div {
+      top: -1rem;
+      span {
+        margin-bottom: 0.75rem;
+      }
+    }
+  }
+}
 </style>
-- 
GitLab


From 6c8990ee9eb5b6e445fd9743911c665b29cc7c9c Mon Sep 17 00:00:00 2001
From: Julien Touchais <5978-julien.touchais@users.noreply.forgemia.inra.fr>
Date: Mon, 16 Oct 2023 15:43:47 +0200
Subject: [PATCH 2/5] feat: :lipstick: add margin around nucleotides & more
 consistent size

---
 src/components/SequenceBoard.vue | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/components/SequenceBoard.vue b/src/components/SequenceBoard.vue
index 4d09d5d..8cf835a 100644
--- a/src/components/SequenceBoard.vue
+++ b/src/components/SequenceBoard.vue
@@ -87,7 +87,7 @@ const sequenceToClipboard = () => {
         v-for="(nucleotide, nucleotideIndex) in sequenceGroup"
         :key="nucleotideIndex"
         :class="[
-          'border-2 border-transparent px-[.125rem] pt-0.5',
+          'mx-[.0625rem] border-2 border-transparent px-[.125rem] pt-0.5',
           highlightedPositions.includes(
             nucleotideIndex + groupIndex * nucleotideGroupsSize + 1
           ) && [
@@ -110,7 +110,11 @@ const sequenceToClipboard = () => {
         v-for="(sequenceGroup, groupIndex) in splittedSequence"
         :key="groupIndex"
         class="mt-5 inline-block select-none text-lg text-slate-400"
-        :style="{ width: `${nucleotideGroupsSize * 1.5}rem` }"
+        :style="{
+          width: `calc(${nucleotideGroupsSize * 0.375}rem + ${
+            nucleotideGroupsSize * 4
+          }px + ${(nucleotideGroupsSize * 4) / 3}ch + 1rem)`
+        }"
       >
         {{ groupIndex * nucleotideGroupsSize + 1 }}
       </span>
-- 
GitLab


From 1014bd3a079cd1c44981aee0777427da1cb96c66 Mon Sep 17 00:00:00 2001
From: Julien Touchais <5978-julien.touchais@users.noreply.forgemia.inra.fr>
Date: Mon, 16 Oct 2023 15:43:47 +0200
Subject: [PATCH 3/5] fix: :lipstick: add padding under the sequence to avoid
 truncation

---
 src/components/SequenceBoard.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/SequenceBoard.vue b/src/components/SequenceBoard.vue
index 8cf835a..3e2426c 100644
--- a/src/components/SequenceBoard.vue
+++ b/src/components/SequenceBoard.vue
@@ -76,7 +76,7 @@ const sequenceToClipboard = () => {
     </Button>
   </div>
   <div
-    class="sequence-parent relative overflow-x-auto overflow-y-hidden pt-4 font-mono text-2xl leading-[4.25rem]"
+    class="sequence-parent relative overflow-x-auto overflow-y-hidden pb-2 pt-4 font-mono text-2xl leading-[4.25rem]"
   >
     <span
       v-for="(sequenceGroup, groupIndex) in splittedSequence"
-- 
GitLab


From 7ef7e1a68241c96331becf38f031b976b5e78513 Mon Sep 17 00:00:00 2001
From: Julien Touchais <5978-julien.touchais@users.noreply.forgemia.inra.fr>
Date: Mon, 16 Oct 2023 15:43:47 +0200
Subject: [PATCH 4/5] fix: :recycle: use a ResizeObserver with individual
 number absolute positionning

---
 src/components/SequenceBoard.vue | 71 +++++++++++++++++++++-----------
 1 file changed, 48 insertions(+), 23 deletions(-)

diff --git a/src/components/SequenceBoard.vue b/src/components/SequenceBoard.vue
index 3e2426c..46c1537 100644
--- a/src/components/SequenceBoard.vue
+++ b/src/components/SequenceBoard.vue
@@ -39,6 +39,37 @@ const sequenceToClipboard = () => {
     }, 400)
   )
 }
+
+const sequenceContainerElement = ref<HTMLElement>()
+const sequenceGroupElements = ref<HTMLElement[]>([])
+const groupNumberElements = ref<HTMLElement[]>([])
+
+const redrawGroupNumbers = () => {
+  document.body.offsetHeight
+  groupNumberElements.value.forEach((groupNumberElement) => {
+    const matchingSequenceGroupElement = sequenceGroupElements.value.find(
+      (element) => {
+        console.log(element)
+        return (
+          element.dataset.groupIndex === groupNumberElement.dataset.groupIndex
+        )
+      }
+    )
+
+    console.log(matchingSequenceGroupElement)
+
+    groupNumberElement.style.left = `${
+      matchingSequenceGroupElement?.offsetLeft || 0
+    }px`
+    groupNumberElement.style.top = `calc(${
+      matchingSequenceGroupElement?.offsetTop || 0
+    }px - 1.25rem)`
+  })
+}
+
+useResizeObserver(sequenceContainerElement, () => {
+  redrawGroupNumbers()
+})
 </script>
 
 <template>
@@ -49,6 +80,7 @@ const sequenceToClipboard = () => {
         v-model="nucleotideGroupsSize"
         :options="[5, 10, 20, 50, 100]"
         class="mt-2 w-52"
+        @hide="redrawGroupNumbers"
       >
         <template #option="{ option }">{{ option }} nucleotides</template>
         <template #value="{ value }">{{ value }} nucleotides</template>
@@ -76,12 +108,16 @@ const sequenceToClipboard = () => {
     </Button>
   </div>
   <div
-    class="sequence-parent relative overflow-x-auto overflow-y-hidden pb-2 pt-4 font-mono text-2xl leading-[4.25rem]"
+    ref="sequenceContainerElement"
+    class="sequence-parent relative overflow-x-auto pb-2 pt-4 font-mono text-2xl leading-[4.25rem]"
   >
     <span
       v-for="(sequenceGroup, groupIndex) in splittedSequence"
+      ref="sequenceGroupElements"
       :key="groupIndex"
-      class="relative z-10 mr-4 mt-8 whitespace-nowrap"
+      :data-group-index="groupIndex"
+      class="mr-4 mt-8 whitespace-nowrap"
+      :style="{ width: `${nucleotideGroupsSize * 1.5}rem` }"
     >
       <span
         v-for="(nucleotide, nucleotideIndex) in sequenceGroup"
@@ -105,20 +141,16 @@ const sequenceToClipboard = () => {
         {{ nucleotide }}
       </span>
     </span>
-    <div class="absolute -top-3 left-0 z-0">
-      <span
-        v-for="(sequenceGroup, groupIndex) in splittedSequence"
-        :key="groupIndex"
-        class="mt-5 inline-block select-none text-lg text-slate-400"
-        :style="{
-          width: `calc(${nucleotideGroupsSize * 0.375}rem + ${
-            nucleotideGroupsSize * 4
-          }px + ${(nucleotideGroupsSize * 4) / 3}ch + 1rem)`
-        }"
-      >
-        {{ groupIndex * nucleotideGroupsSize + 1 }}
-      </span>
-    </div>
+
+    <span
+      v-for="(sequenceGroup, groupIndex) in splittedSequence"
+      :key="groupIndex"
+      ref="groupNumberElements"
+      class="absolute select-none text-sm text-slate-400"
+      :data-group-index="groupIndex"
+    >
+      {{ groupIndex * nucleotideGroupsSize + 1 }}
+    </span>
   </div>
 </template>
 
@@ -139,13 +171,6 @@ const sequenceToClipboard = () => {
     > span {
       display: inline-block;
     }
-
-    > div {
-      top: -1rem;
-      span {
-        margin-bottom: 0.75rem;
-      }
-    }
   }
 }
 </style>
-- 
GitLab


From dd8e51479d12227a230b770cde01dc7de4c8c498 Mon Sep 17 00:00:00 2001
From: Julien Touchais <5978-julien.touchais@users.noreply.forgemia.inra.fr>
Date: Mon, 16 Oct 2023 15:43:47 +0200
Subject: [PATCH 5/5] fix: :mute: remove logs

---
 src/components/SequenceBoard.vue | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/components/SequenceBoard.vue b/src/components/SequenceBoard.vue
index 46c1537..d7060c4 100644
--- a/src/components/SequenceBoard.vue
+++ b/src/components/SequenceBoard.vue
@@ -49,15 +49,12 @@ const redrawGroupNumbers = () => {
   groupNumberElements.value.forEach((groupNumberElement) => {
     const matchingSequenceGroupElement = sequenceGroupElements.value.find(
       (element) => {
-        console.log(element)
         return (
           element.dataset.groupIndex === groupNumberElement.dataset.groupIndex
         )
       }
     )
 
-    console.log(matchingSequenceGroupElement)
-
     groupNumberElement.style.left = `${
       matchingSequenceGroupElement?.offsetLeft || 0
     }px`
-- 
GitLab