This is an automated email from the ASF dual-hosted git repository.

rstrickland pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/daffodil-vscode.git


The following commit(s) were added to refs/heads/main by this push:
     new 57d3be2  Cleaning Data Editor Legacy Code
57d3be2 is described below

commit 57d3be20353fb2e78157bcbd8f7500c6e744c413
Author: Robert Strickland <[email protected]>
AuthorDate: Thu Aug 10 15:19:25 2023 -0500

    Cleaning Data Editor Legacy Code
    
    - Removes lingering variables & functionality due to the rapid
      development of the data editor.
    - Fixes issue where the data view content control showed index of
      viewport container instead of file offset.
    
    Closes #771
    Closes #773
---
 .../DataDisplays/CustomByteDisplay/BinaryData.ts   | 108 +-------------
 .../CustomByteDisplay/DataLineFeed.svelte          |  18 +--
 .../FileTraversalIndicator.svelte                  |   2 +-
 .../CustomByteDisplay/SelectedByteEdit.svelte      |  67 +++++----
 .../components/DataDisplays/DataViewports.svelte   |  74 +---------
 .../DataDisplays/Fieldsets/ContentControls.svelte  |   2 +-
 .../DataDisplays/Fieldsets/DataView.svelte         |   4 +-
 .../DataDisplays/Header/DisplayHeader.svelte       |   7 +-
 .../DataMetrics/ByteFrequencyGraph.svelte          |  14 +-
 src/svelte/src/components/Header/Header.svelte     |   3 +-
 .../components/Header/fieldsets/FileMetrics.svelte |   5 +-
 .../src/components/Header/fieldsets/FileMetrics.ts |   4 +-
 .../Header/fieldsets/SearchReplace.svelte          |  14 +-
 .../components/Header/fieldsets/SearchReplace.ts   |  58 +-------
 .../components/Header/fieldsets/Settings.svelte    |   7 +-
 .../src/components/Inputs/Buttons/Button.svelte    |   8 +-
 .../Inputs/Buttons/ToggleableButton.svelte         |   4 +-
 .../components/ServerMetrics/ServerMetrics.svelte  |   4 +-
 src/svelte/src/components/dataEditor.svelte        |  73 ++--------
 src/svelte/src/components/layouts/Tooltip.svelte   |   2 +-
 src/svelte/src/stores/configuration.ts             |   4 -
 src/svelte/src/stores/index.ts                     | 156 ++++++++++++---------
 src/svelte/src/utilities/display.ts                |  30 +---
 src/svelte/src/utilities/highlights.ts             |   2 +-
 24 files changed, 186 insertions(+), 484 deletions(-)

diff --git 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/BinaryData.ts 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/BinaryData.ts
index 4aa9cc2..e3f9e31 100644
--- a/src/svelte/src/components/DataDisplays/CustomByteDisplay/BinaryData.ts
+++ b/src/svelte/src/components/DataDisplays/CustomByteDisplay/BinaryData.ts
@@ -15,9 +15,8 @@
  * limitations under the License.
  */
 
-import { writable, derived } from 'svelte/store'
 import { SimpleWritable } from '../../../stores/localStore'
-import type { BytesPerRow, RadixValues } from '../../../stores/configuration'
+import type { RadixValues } from '../../../stores/configuration'
 import { radixBytePad } from '../../../utilities/display'
 
 export const BYTE_ACTION_DIV_OFFSET: number = 24
@@ -53,17 +52,6 @@ export interface EditByteEvent extends EditEvent {
   targetByte: ByteValue
 }
 
-export enum ViewportBoundaryTrigger {
-  SCROLL_TOP,
-  SCROLL_BOTTOM,
-}
-
-export const scroll_boundary_event = (top: boolean, end: boolean) => {
-  return top
-    ? ViewportBoundaryTrigger.SCROLL_TOP
-    : ViewportBoundaryTrigger.SCROLL_BOTTOM
-}
-
 export const byte_value_string = (value: number, radix: RadixValues) => {
   if (value > 255)
     throw `Value {${value}} is larger than an unsigned int (255).`
@@ -87,8 +75,6 @@ export const RADIX_REGEX_MATCH_STR = {
   2: /[0-1]{8}/g,
 }
 
-export const processingViewportRefresh = writable(false)
-
 export class ViewportData_t {
   data = new Uint8Array(0)
   fileOffset = -1
@@ -160,98 +146,6 @@ export class ViewportDataStore_t extends 
SimpleWritable<ViewportData_t> {
   }
 }
 
-export const viewport = new ViewportDataStore_t()
-
-export type ByteActionPxOffsets = {
-  insertBefore: {
-    left: number
-    top: number
-  }
-  insertAfter: {
-    left: number
-    top: number
-  }
-  delete: {
-    left: number
-    top: number
-  }
-  input: {
-    left: number
-    top: number
-  }
-}
-
 export function latin1Undefined(charCode: number): boolean {
   return charCode < 32 || (charCode > 126 && charCode < 160)
 }
-
-export function update_byte_action_offsets(
-  targetDiv: HTMLDivElement,
-  offsetTopBy: number = 0,
-  offsetLeftBy: number = 0
-) {
-  const targetWidth = parseInt(targetDiv.style.width.replace('px', '')) + 4
-  byteActionPxOffsets.update((currentOffsets) => {
-    currentOffsets.delete = {
-      left: targetDiv.offsetLeft + offsetLeftBy,
-      top: targetDiv.offsetTop + BYTE_ACTION_DIV_OFFSET - offsetTopBy,
-    }
-    currentOffsets.input = {
-      left: targetDiv.offsetLeft + offsetLeftBy,
-      top: targetDiv.offsetTop - offsetTopBy,
-    }
-    currentOffsets.insertAfter = {
-      left: targetDiv.offsetLeft + targetWidth + offsetLeftBy,
-      top: targetDiv.offsetTop - offsetTopBy,
-    }
-    currentOffsets.insertBefore = {
-      left: targetDiv.offsetLeft - targetWidth + offsetLeftBy,
-      top: targetDiv.offsetTop - offsetTopBy,
-    }
-
-    return currentOffsets
-  })
-}
-
-export enum ByteValuePxWidths {
-  DISPLAY = 20,
-  EDITING = 68,
-}
-
-export let ByteValueArray: Array<ByteValue> = []
-
-export const bytesPerRow = writable(16 as BytesPerRow)
-export const editingByte = writable(false)
-export const selectedByte = writable({
-  text: '',
-  offset: -1,
-  value: -1,
-} as ByteValue)
-export const byteActionPxOffsets = writable({
-  insertBefore: {
-    left: 0,
-    top: 0,
-  },
-  insertAfter: {
-    left: 0,
-    top: 0,
-  },
-  delete: {
-    left: 0,
-    top: 0,
-  },
-  input: {
-    left: 0,
-    top: 0,
-  },
-} as ByteActionPxOffsets)
-export const mouseSelectionBytes = writable({ mousedown: -1, mouseup: -1 })
-
-// derived readable number whose value is the computed number of bytes in the 
edited file
-export const offsetMax = derived(viewport, ($viewport) => {
-  // this should be the same as the computed file size
-  return $viewport.fileOffset + $viewport.length + $viewport.bytesLeft
-})
-export function focus_byte_input() {
-  document.getElementById('byte-input').focus()
-}
diff --git 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/DataLineFeed.svelte 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/DataLineFeed.svelte
index 8d70148..ebfe8b7 100644
--- 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/DataLineFeed.svelte
+++ 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/DataLineFeed.svelte
@@ -15,7 +15,7 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 <script lang="ts">
-  import { createEventDispatcher, onMount, tick } from 'svelte'
+  import { createEventDispatcher, onMount } from 'svelte'
   import {
     editedDataSegment,
     editMode,
@@ -24,6 +24,10 @@ limitations under the License.
     seekOffsetInput,
     selectionDataStore,
     selectionSize,
+    selectedByte,
+    fileMetrics,
+    searchQuery,
+    editorActionsAllowed,
   } from '../../../stores'
   import {
     EditByteModes,
@@ -31,18 +35,15 @@ limitations under the License.
     VIEWPORT_CAPACITY_MAX,
     type BytesPerRow,
     type RadixValues,
-    editorActionsAllowed,
     EditActionRestrictions,
   } from '../../../stores/configuration'
   import { MessageCommand } from '../../../utilities/message'
   import { vscode } from '../../../utilities/vscode'
-  import { fileMetrics } from '../../Header/fieldsets/FileMetrics'
   import Button from '../../Inputs/Buttons/Button.svelte'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
   import {
     byte_value_string,
     null_byte,
-    selectedByte,
     type ByteSelectionEvent,
     type ByteValue,
     type ViewportData_t,
@@ -63,7 +64,6 @@ limitations under the License.
     searchResultsHighlights,
     updateSearchResultsHighlights,
   } from '../../../utilities/highlights'
-  import { searchQuery } from '../../Header/fieldsets/SearchReplace'
 
   export let lineTop: number
   export let awaitViewportScroll: boolean
@@ -119,7 +119,6 @@ limitations under the License.
   let totalLinesPerViewport = 0
   let lineTopMaxViewport = 64
   let lineTopMaxFile = 64
-  let viewportFileSegment = 1
   let atViewportHead = true
   let atViewportTail = false
   let atFileHead = true
@@ -168,7 +167,6 @@ limitations under the License.
       totalLinesPerViewport - NUM_LINES_DISPLAYED,
       0
     )
-    viewportFileSegment = viewportData.fileOffset / viewportData.length + 1
 
     atViewportHead = lineTop === 0
     atViewportTail = lineTop === lineTopMaxViewport
@@ -360,7 +358,6 @@ limitations under the License.
         ? selectionEvent.targetByte
         : null_byte()
 
-    // update_byte_action_offsets(selectionEvent.targetElement)
     selectedByteElement = selectionEvent.targetElement
 
     editedDataSegment.update(() => {
@@ -468,10 +465,7 @@ limitations under the License.
 
 <div class="container" style:height id={CONTAINER_ID}>
   {#each viewportLines as viewportLine, i}
-    <div
-      class={`line ${viewportLine.highlight} ${themeClass}`}
-      title={`file line #${viewportLine.fileLine}`}
-    >
+    <div class={`line ${viewportLine.highlight} ${themeClass}`}>
       <div class="address" id="address">
         <b>{viewportLine.offset}</b>
       </div>
diff --git 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/FileTraversalIndicator.svelte
 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/FileTraversalIndicator.svelte
index 56c9142..7c7b8f4 100644
--- 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/FileTraversalIndicator.svelte
+++ 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/FileTraversalIndicator.svelte
@@ -25,7 +25,7 @@ limitations under the License.
   export let bytesPerRow = 16
   export let percentageTraversed
   export let maxDisplayLines = 20
-  export let selectionActive
+  export let selectionActive: boolean
 
   let indicatorContainer: HTMLElement
   let indicatorClickDisabled: boolean = false
diff --git 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/SelectedByteEdit.svelte
 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/SelectedByteEdit.svelte
index 3b75540..b46adb4 100644
--- 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/SelectedByteEdit.svelte
+++ 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/SelectedByteEdit.svelte
@@ -32,17 +32,16 @@ limitations under the License.
     addressRadix,
     rerenderActionElements,
     focusedViewportId,
+    editorActionsAllowed,
+    bytesPerRow,
   } from '../../../stores'
   import { enterKeypressEvents } from '../../../utilities/enterKeypressEvents'
-  import { bytesPerRow, type ByteValue, type EditAction } from './BinaryData'
+  import type { ByteValue, EditAction } from './BinaryData'
   import {
     UIThemeCSSClass,
     type CSSThemeClass,
   } from '../../../utilities/colorScheme'
-  import {
-    EditActionRestrictions,
-    editorActionsAllowed,
-  } from '../../../stores/configuration'
+  import { EditActionRestrictions } from '../../../stores/configuration'
 
   const eventDispatcher = createEventDispatcher()
 
@@ -55,6 +54,7 @@ limitations under the License.
     id: string
     position: ActionElementPosition
     HTMLRef: HTMLDivElement | HTMLInputElement
+    render: boolean
   }
   type ActionElements = {
     [k in Actions]: ActionElement
@@ -63,21 +63,25 @@ limitations under the License.
     input: {
       id: 'binary-action-input',
       HTMLRef: undefined as HTMLInputElement,
+      render: true,
       position: { viewportLine: -1, viewportByteIndex: -1 },
     },
     'insert-before': {
       id: 'binary-action-before',
       HTMLRef: undefined,
+      render: true,
       position: { viewportLine: -1, viewportByteIndex: -1 },
     },
     'insert-after': {
       id: 'binary-action-after',
       HTMLRef: undefined,
+      render: true,
       position: { viewportLine: -1, viewportByteIndex: -1 },
     },
     delete: {
       id: 'binary-action-delete',
       HTMLRef: undefined,
+      render: true,
       position: { viewportLine: -1, viewportByteIndex: -1 },
     },
   }
@@ -210,7 +214,10 @@ limitations under the License.
             previousByteId
           ) as HTMLDivElement
 
-          if (!elementToReplace) break
+          if (!elementToReplace) {
+            actionElements[element].render = false
+            break
+          }
 
           targetParent.contains(elementToReplace)
             ? apply_element_replacements(
@@ -236,7 +243,10 @@ limitations under the License.
             nextByteId
           ) as HTMLDivElement
 
-          if (!elementToReplace) break
+          if (!elementToReplace) {
+            actionElements[element].render = false
+            break
+          }
 
           targetParent.contains(elementToReplace)
             ? apply_element_replacements(
@@ -297,36 +307,33 @@ limitations under the License.
   function byteOffsetToElementId(byteOffset: number): string {
     return $focusedViewportId + '-' + byteOffset.toString()
   }
-  function element_byteline_position(
-    targetElement: HTMLDivElement
-  ): number | undefined {
-    const index = parseInt(targetElement.id) + 1
-    return index % BPR
-  }
 </script>
 
 {#if $editorActionsAllowed == EditActionRestrictions.None}
   <!-- svelte-ignore a11y-click-events-have-key-events -->
   <!-- svelte-ignore a11y-no-static-element-interactions -->
-  <div
-    class="insert-before {themeClass}"
-    id={actionElements['insert-before'].id}
-    style:width={elementDivWidth}
-    on:click={send_insert}
-  >
-    &#8676;
-  </div>
-
+  {#if actionElements['insert-before'].render}
+    <div
+      class="insert-before {themeClass}"
+      id={actionElements['insert-before'].id}
+      style:width={elementDivWidth}
+      on:click={send_insert}
+    >
+      &#8676;
+    </div>
+  {/if}
   <!-- svelte-ignore a11y-click-events-have-key-events -->
   <!-- svelte-ignore a11y-no-static-element-interactions -->
-  <div
-    class="insert-after {themeClass}"
-    id={actionElements['insert-after'].id}
-    style:width={elementDivWidth}
-    on:click={send_insert}
-  >
-    &#8677;
-  </div>
+  {#if actionElements['insert-after'].render}
+    <div
+      class="insert-after {themeClass}"
+      id={actionElements['insert-after'].id}
+      style:width={elementDivWidth}
+      on:click={send_insert}
+    >
+      &#8677;
+    </div>
+  {/if}
 
   <span>
     <input
diff --git a/src/svelte/src/components/DataDisplays/DataViewports.svelte 
b/src/svelte/src/components/DataDisplays/DataViewports.svelte
index 38ad6cc..b031f25 100644
--- a/src/svelte/src/components/DataDisplays/DataViewports.svelte
+++ b/src/svelte/src/components/DataDisplays/DataViewports.svelte
@@ -18,84 +18,12 @@ limitations under the License.
   import {
     addressRadix,
     bytesPerRow,
-    editMode,
-    editedDataSegment,
-    editorEncoding,
-    selectionDataStore,
-    selectionSize,
-    viewportClientHeight,
-    viewportLineHeight,
-    viewportScrollHeight,
-    viewportScrollTop,
-    viewportLength,
     displayRadix,
     dataFeedLineTop,
     dataFeedAwaitRefresh,
+    viewport,
   } from '../../stores'
-  import {
-    viewport_references,
-    type ViewportReferences,
-  } from '../../utilities/display'
-  import { MessageCommand } from '../../utilities/message'
-  import { onMount, tick } from 'svelte'
-  import { vscode } from '../../utilities/vscode'
-  import { EditByteModes } from '../../stores/configuration'
-  import { viewport } from './CustomByteDisplay/BinaryData'
   import DataLineFeed from './CustomByteDisplay/DataLineFeed.svelte'
-
-  const viewportRefs = viewport_references() as ViewportReferences
-
-  //
-  // reactive statements
-  //
-
-  $: {
-    $editMode === EditByteModes.Single
-      ? postEditorOnChangeMsg('hex')
-      : postEditorOnChangeMsg($editorEncoding)
-
-    // when the viewport length changes, update the viewport geometry
-    if ($viewportLength >= 0) {
-      // populateViewportGeometry()
-    }
-  }
-
-  function populateViewportGeometry() {
-    // event handlers expect synchronous functions, so wrap the async function 
in a sync function
-    async function populateViewportGeometryOps_() {
-      if (viewportRefs.physical) {
-        // wait for the DOM to be updated before getting the viewport geometry
-        await tick()
-        $viewportScrollTop = viewportRefs.physical.scrollTop
-        $viewportScrollHeight = viewportRefs.physical.scrollHeight
-        $viewportClientHeight = viewportRefs.physical.clientHeight
-        $viewportLineHeight = parseFloat(
-          getComputedStyle(viewportRefs.physical).lineHeight
-        )
-      }
-    }
-
-    populateViewportGeometryOps_()
-  }
-
-  function postEditorOnChangeMsg(forcedEncoding?: string) {
-    vscode.postMessage({
-      command: MessageCommand.editorOnChange,
-      data: {
-        fileOffset: $selectionDataStore.startOffset,
-        selectionData: $editedDataSegment,
-        encoding: forcedEncoding ? forcedEncoding : $editorEncoding,
-        selectionSize: $selectionSize,
-        editMode: $editMode,
-      },
-    })
-  }
-
-  onMount(() => {
-    // populateViewportGeometry()
-    // recalculate the viewport geometry when the window is resized
-    // window.addEventListener('resize', populateViewportGeometry)
-  })
 </script>
 
 <DataLineFeed
diff --git 
a/src/svelte/src/components/DataDisplays/Fieldsets/ContentControls.svelte 
b/src/svelte/src/components/DataDisplays/Fieldsets/ContentControls.svelte
index d22aa6b..16ceef9 100644
--- a/src/svelte/src/components/DataDisplays/Fieldsets/ContentControls.svelte
+++ b/src/svelte/src/components/DataDisplays/Fieldsets/ContentControls.svelte
@@ -20,7 +20,7 @@ limitations under the License.
   import { createEventDispatcher } from 'svelte'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
   import Button from '../../Inputs/Buttons/Button.svelte'
-  import { type EditEvent } from '../CustomByteDisplay/BinaryData'
+  import type { EditEvent } from '../CustomByteDisplay/BinaryData'
   const eventDispatcher = createEventDispatcher()
 
   function applyChanges(event: Event) {
diff --git a/src/svelte/src/components/DataDisplays/Fieldsets/DataView.svelte 
b/src/svelte/src/components/DataDisplays/Fieldsets/DataView.svelte
index dc75563..f648f20 100644
--- a/src/svelte/src/components/DataDisplays/Fieldsets/DataView.svelte
+++ b/src/svelte/src/components/DataDisplays/Fieldsets/DataView.svelte
@@ -30,12 +30,12 @@ limitations under the License.
     dvUint8,
     selectionDataStore,
     editedDataSegment,
+    selectedByte,
   } from '../../../stores'
   import { ENDIANNESS_OPTIONS } from '../../../stores/configuration'
   import { UIThemeCSSClass } from '../../../utilities/colorScheme'
-  import Input from '../../Inputs/Input/Input.svelte'
   import { createEventDispatcher } from 'svelte'
-  import { selectedByte } from '../CustomByteDisplay/BinaryData'
+  import Input from '../../Inputs/Input/Input.svelte'
 
   const eventDispatcher = createEventDispatcher()
   const ERROR_MESSAGE_TIMEOUT = 5000
diff --git a/src/svelte/src/components/DataDisplays/Header/DisplayHeader.svelte 
b/src/svelte/src/components/DataDisplays/Header/DisplayHeader.svelte
index 2350ef0..28450cd 100644
--- a/src/svelte/src/components/DataDisplays/Header/DisplayHeader.svelte
+++ b/src/svelte/src/components/DataDisplays/Header/DisplayHeader.svelte
@@ -23,6 +23,8 @@ limitations under the License.
     seekOffsetInput,
     selectionDataStore,
     selectionSize,
+    bytesPerRow,
+    viewport,
   } from '../../../stores'
   import {
     EditByteModes,
@@ -33,7 +35,6 @@ limitations under the License.
   } from '../../../stores/configuration'
   import { UIThemeCSSClass } from '../../../utilities/colorScheme'
   import { createEventDispatcher } from 'svelte'
-  import { bytesPerRow } from '../CustomByteDisplay/BinaryData'
 
   type ViewportDivSpread = '24px' | '28px' | '68px'
 
@@ -60,8 +61,8 @@ limitations under the License.
 
   $: selectionOffsetText = setSelectionOffsetInfo(
     'Selection',
-    $selectionDataStore.startOffset,
-    $selectionDataStore.endOffset,
+    $viewport.fileOffset + $selectionDataStore.startOffset,
+    $viewport.fileOffset + $selectionDataStore.endOffset,
     $selectionSize,
     $addressRadix
   )
diff --git a/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte 
b/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
index 2841ff4..cbbaa92 100644
--- a/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
+++ b/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
@@ -20,7 +20,7 @@ limitations under the License.
   import { MessageCommand } from '../../utilities/message'
   import { onMount } from 'svelte'
   import Input from '../Inputs/Input/Input.svelte'
-  import { offsetMax } from '../DataDisplays/CustomByteDisplay/BinaryData'
+  import { viewport } from '../../stores'
   import { DATA_PROFILE_MAX_LENGTH } from '../../stores/configuration'
   import { addressRadix } from '../../stores'
   import { radixToString, regexEditDataTest } from '../../utilities/display'
@@ -179,9 +179,9 @@ limitations under the License.
           } else if (endOffsetTemp <= startOffset) {
             setErrorMessage('End offset must be greater than start offset')
             return
-          } else if (endOffsetTemp > $offsetMax) {
+          } else if (endOffsetTemp > viewport.offsetMax) {
             setErrorMessage(
-              `End offset must be less than or equal to ${$offsetMax}`
+              `End offset must be less than or equal to ${viewport.offsetMax}`
             )
             return
           }
@@ -211,9 +211,11 @@ limitations under the License.
           } else if (lengthTemp <= 0) {
             setErrorMessage('Length must be greater than 0')
             return
-          } else if (lengthTemp > $offsetMax - startOffset) {
+          } else if (lengthTemp > viewport.offsetMax - startOffset) {
             setErrorMessage(
-              `Length must be less than or equal to ${$offsetMax - 
startOffset}`
+              `Length must be less than or equal to ${
+                viewport.offsetMax - startOffset
+              }`
             )
             return
           }
@@ -401,7 +403,7 @@ limitations under the License.
   <div class="stats">
     <label for="computed-size"
       >&nbsp;Max Offset: <span id="computed-size" class="nowrap"
-        >{$offsetMax}</span
+        >{viewport.offsetMax}</span
       ></label
     >
     <label for="min-frequency"
diff --git a/src/svelte/src/components/Header/Header.svelte 
b/src/svelte/src/components/Header/Header.svelte
index 0a926ae..e04cbfd 100644
--- a/src/svelte/src/components/Header/Header.svelte
+++ b/src/svelte/src/components/Header/Header.svelte
@@ -16,11 +16,12 @@ limitations under the License.
 -->
 <script lang="ts">
   import FileMetrics from './fieldsets/FileMetrics.svelte'
-  import { fileMetrics } from './fieldsets/FileMetrics'
   import SearchReplace from './fieldsets/SearchReplace.svelte'
   import Settings from './fieldsets/Settings.svelte'
   import FlexContainer from '../layouts/FlexContainer.svelte'
   import { UIThemeCSSClass } from '../../utilities/colorScheme'
+  import { fileMetrics } from '../../stores'
+
   let hideChildren = false
 </script>
 
diff --git a/src/svelte/src/components/Header/fieldsets/FileMetrics.svelte 
b/src/svelte/src/components/Header/fieldsets/FileMetrics.svelte
index 429478c..ca5a559 100644
--- a/src/svelte/src/components/Header/fieldsets/FileMetrics.svelte
+++ b/src/svelte/src/components/Header/fieldsets/FileMetrics.svelte
@@ -17,14 +17,13 @@ limitations under the License.
 <script lang="ts">
   import Button from '../../Inputs/Buttons/Button.svelte'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
-  import { fileMetrics } from './FileMetrics'
   import { MessageCommand } from '../../../utilities/message'
   import { vscode } from '../../../utilities/vscode'
-  import { saveable } from '../../../stores'
+  import { saveable, fileMetrics } from '../../../stores'
   import { createEventDispatcher } from 'svelte'
   import SidePanel from '../../layouts/SidePanel.svelte'
   import ByteFrequencyGraph from '../../DataMetrics/ByteFrequencyGraph.svelte'
-  import { viewport } from '../../DataDisplays/CustomByteDisplay/BinaryData'
+  import { viewport } from '../../../stores'
   import { humanReadableByteLength } from '../../../utilities/display'
   import { DATA_PROFILE_MAX_LENGTH } from '../../../stores/configuration'
   import Tooltip from '../../layouts/Tooltip.svelte'
diff --git a/src/svelte/src/components/Header/fieldsets/FileMetrics.ts 
b/src/svelte/src/components/Header/fieldsets/FileMetrics.ts
index 45e64de..053f915 100644
--- a/src/svelte/src/components/Header/fieldsets/FileMetrics.ts
+++ b/src/svelte/src/components/Header/fieldsets/FileMetrics.ts
@@ -24,10 +24,8 @@ class FileMetricsData {
   undoCount: number = 0
 }
 
-class FileMetrics extends SimpleWritable<FileMetricsData> {
+export class FileMetrics extends SimpleWritable<FileMetricsData> {
   protected init(): FileMetricsData {
     return new FileMetricsData()
   }
 }
-
-export const fileMetrics = new FileMetrics()
diff --git a/src/svelte/src/components/Header/fieldsets/SearchReplace.svelte 
b/src/svelte/src/components/Header/fieldsets/SearchReplace.svelte
index 36251a7..7f32d7a 100644
--- a/src/svelte/src/components/Header/fieldsets/SearchReplace.svelte
+++ b/src/svelte/src/components/Header/fieldsets/SearchReplace.svelte
@@ -18,11 +18,10 @@ limitations under the License.
   import {
     addressRadix,
     allowCaseInsensitiveSearch,
+    editorActionsAllowed,
     editorEncoding,
     seekable,
     seekOffsetInput,
-  } from '../../../stores'
-  import {
     replaceable,
     replaceErr,
     replaceQuery,
@@ -30,7 +29,7 @@ limitations under the License.
     searchErr,
     searchQuery,
     seekErr,
-  } from './SearchReplace'
+  } from '../../../stores'
   import { vscode } from '../../../utilities/vscode'
   import { MessageCommand } from '../../../utilities/message'
 
@@ -38,18 +37,15 @@ limitations under the License.
   import Button from '../../Inputs/Buttons/Button.svelte'
   import Input from '../../Inputs/Input/Input.svelte'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
-  import { createEventDispatcher, tick } from 'svelte'
+  import { createEventDispatcher } from 'svelte'
   import { UIThemeCSSClass } from '../../../utilities/colorScheme'
   import ToggleableButton from '../../Inputs/Buttons/ToggleableButton.svelte'
   import {
     clearSearchResultsHighlights,
     updateSearchResultsHighlights,
   } from '../../../utilities/highlights'
-  import { viewport } from '../../DataDisplays/CustomByteDisplay/BinaryData'
-  import {
-    EditActionRestrictions,
-    editorActionsAllowed,
-  } from '../../../stores/configuration'
+  import { viewport } from '../../../stores'
+  import { EditActionRestrictions } from '../../../stores/configuration'
 
   const eventDispatcher = createEventDispatcher()
 
diff --git a/src/svelte/src/components/Header/fieldsets/SearchReplace.ts 
b/src/svelte/src/components/Header/fieldsets/SearchReplace.ts
index 45bdd7f..089ec07 100644
--- a/src/svelte/src/components/Header/fieldsets/SearchReplace.ts
+++ b/src/svelte/src/components/Header/fieldsets/SearchReplace.ts
@@ -18,10 +18,6 @@
 import { SimpleWritable } from '../../../stores/localStore'
 import { addressRadix, seekOffsetInput } from '../../../stores'
 import { get } from 'svelte/store'
-import { validateEncodingStr } from '../../../utilities/display'
-import { ErrorStore, ErrorComponentType } from '../../Error/Error'
-import { editorEncoding, selectionDataStore } from '../../../stores'
-import { derived } from 'svelte/store'
 
 interface QueryableData {
   input: string
@@ -37,7 +33,7 @@ class SearchData implements QueryableData {
   overflow: boolean = false
   byteLength: number = 0
 }
-class SearchQuery extends SimpleWritable<SearchData> {
+export class SearchQuery extends SimpleWritable<SearchData> {
   protected init(): SearchData {
     return new SearchData()
   }
@@ -80,55 +76,3 @@ export class ReplaceQuery extends 
SimpleWritable<ReplaceData> {
     return new ReplaceData()
   }
 }
-
-export const searchQuery = new SearchQuery()
-export const replaceQuery = new ReplaceQuery()
-
-export const searchErr = new ErrorStore(ErrorComponentType.SYMBOL)
-export const replaceErr = new ErrorStore(ErrorComponentType.SYMBOL)
-export const seekErr = new ErrorStore(ErrorComponentType.SYMBOL)
-
-export const searchable = derived(
-  [searchQuery, editorEncoding],
-  ([$searchQuery, $editorEncoding]) => {
-    if ($searchQuery.input.length === 0 || $searchQuery.processing) {
-      searchErr.update(() => {
-        return ''
-      })
-      return false
-    }
-    const ret = validateEncodingStr($searchQuery.input, $editorEncoding, 
'full')
-    searchErr.update(() => {
-      return ret.errMsg
-    })
-    return ret.valid
-  }
-)
-
-export const replaceable = derived(
-  [replaceQuery, editorEncoding, searchable, selectionDataStore],
-  ([$replaceData, $editorEncoding, $searchable, $selectionData]) => {
-    if (
-      $replaceData.input.length < 0 ||
-      !$searchable ||
-      $replaceData.processing
-    ) {
-      replaceErr.update(() => {
-        return ''
-      })
-      return false
-    }
-    if ($selectionData.active) {
-      replaceErr.update(() => {
-        return 'Cannot replace while viewport data is selected'
-      })
-      return false
-    }
-
-    const ret = validateEncodingStr($replaceData.input, $editorEncoding)
-    replaceErr.update(() => {
-      return ret.errMsg
-    })
-    return ret.valid
-  }
-)
diff --git a/src/svelte/src/components/Header/fieldsets/Settings.svelte 
b/src/svelte/src/components/Header/fieldsets/Settings.svelte
index 298388e..2605a7e 100644
--- a/src/svelte/src/components/Header/fieldsets/Settings.svelte
+++ b/src/svelte/src/components/Header/fieldsets/Settings.svelte
@@ -19,9 +19,12 @@ limitations under the License.
     RADIX_OPTIONS,
     ENCODING_GROUPS,
     EDIT_ACTIONS,
-    editorActionsAllowed,
   } from '../../../stores/configuration'
-  import { displayRadix, editorEncoding } from '../../../stores'
+  import {
+    displayRadix,
+    editorEncoding,
+    editorActionsAllowed,
+  } from '../../../stores'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
   import { UIThemeCSSClass } from '../../../utilities/colorScheme'
 </script>
diff --git a/src/svelte/src/components/Inputs/Buttons/Button.svelte 
b/src/svelte/src/components/Inputs/Buttons/Button.svelte
index acad004..1b624d6 100644
--- a/src/svelte/src/components/Inputs/Buttons/Button.svelte
+++ b/src/svelte/src/components/Inputs/Buttons/Button.svelte
@@ -15,14 +15,14 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 <script lang="ts">
+  import Tooltip from '../../layouts/Tooltip.svelte'
+  import FlexContainer from '../../layouts/FlexContainer.svelte'
   import { onMount } from 'svelte'
+  import { UIThemeCSSClass } from '../../../utilities/colorScheme'
+  import { tooltipsEnabled } from '../../../stores'
   export let fn: (event?: Event) => void
   export let disabledBy = false
   export let width = ''
-  import { UIThemeCSSClass } from '../../../utilities/colorScheme'
-  import FlexContainer from '../../layouts/FlexContainer.svelte'
-  import Tooltip from '../../layouts/Tooltip.svelte'
-  import { tooltipsEnabled } from '../../../utilities/display'
 
   onMount(() => {
     collapseContent = document.body.clientWidth <= 1600
diff --git a/src/svelte/src/components/Inputs/Buttons/ToggleableButton.svelte 
b/src/svelte/src/components/Inputs/Buttons/ToggleableButton.svelte
index dfd5079..388cccf 100644
--- a/src/svelte/src/components/Inputs/Buttons/ToggleableButton.svelte
+++ b/src/svelte/src/components/Inputs/Buttons/ToggleableButton.svelte
@@ -19,9 +19,9 @@ limitations under the License.
   export let disabledBy = false
   export let width = ''
   export let active = false
-  import { UIThemeCSSClass } from '../../../utilities/colorScheme'
-  import FlexContainer from '../../layouts/FlexContainer.svelte'
   import Tooltip from '../../layouts/Tooltip.svelte'
+  import FlexContainer from '../../layouts/FlexContainer.svelte'
+  import { UIThemeCSSClass } from '../../../utilities/colorScheme'
 
   export let description: string
 </script>
diff --git a/src/svelte/src/components/ServerMetrics/ServerMetrics.svelte 
b/src/svelte/src/components/ServerMetrics/ServerMetrics.svelte
index a8b98a4..e18bfc3 100644
--- a/src/svelte/src/components/ServerMetrics/ServerMetrics.svelte
+++ b/src/svelte/src/components/ServerMetrics/ServerMetrics.svelte
@@ -15,8 +15,8 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 <script lang="ts">
-  import { MessageCommand } from '../../utilities/message'
   import FlexContainer from '../layouts/FlexContainer.svelte'
+  import { MessageCommand } from '../../utilities/message'
 
   let heartbeat = {
     latency: 0,
@@ -28,7 +28,7 @@ limitations under the License.
     serverVersion: 'Unknown',
     sessionCount: 0,
   }
-  let timerId: number = 0
+  let timerId: NodeJS.Timeout
 
   function showHeartbeatInfo(show: boolean) {
     const element = document.getElementsByClassName(
diff --git a/src/svelte/src/components/dataEditor.svelte 
b/src/svelte/src/components/dataEditor.svelte
index 47c799c..4cb9c24 100644
--- a/src/svelte/src/components/dataEditor.svelte
+++ b/src/svelte/src/components/dataEditor.svelte
@@ -29,14 +29,13 @@ limitations under the License.
     requestable,
     selectionDataStore,
     selectionSize,
-    viewportCapacity,
-    viewportEndOffset,
-    viewportFollowingByteCount,
     viewportNumLinesDisplayed,
-    viewportStartOffset,
     dataFeedLineTop,
     SelectionData_t,
     dataFeedAwaitRefresh,
+    fileMetrics,
+    viewport,
+    searchQuery,
   } from '../stores'
   import {
     CSSThemeClass,
@@ -47,22 +46,18 @@ limitations under the License.
   import { vscode } from '../utilities/vscode'
   import Header from './Header/Header.svelte'
   import Main from './Main.svelte'
-  import { EditByteModes } from '../stores/configuration'
+  import { EditByteModes, NUM_LINES_DISPLAYED } from '../stores/configuration'
   import ServerMetrics from './ServerMetrics/ServerMetrics.svelte'
   import { enterKeypressEvents } from '../utilities/enterKeypressEvents'
-  import {
-    type EditEvent,
-    viewport,
+  import type {
+    EditEvent,
     ViewportData_t,
   } from './DataDisplays/CustomByteDisplay/BinaryData'
-  import { fileMetrics } from './Header/fieldsets/FileMetrics'
   import {
-    DISPLAYED_DATA_LINES,
     byte_count_divisible_offset,
     viewport_offset_to_line_num,
   } from '../utilities/display'
   import { clearSearchResultsHighlights } from '../utilities/highlights'
-  import { searchQuery } from './Header/fieldsets/SearchReplace'
 
   $: $UIThemeCSSClass = $darkUITheme ? CSSThemeClass.Dark : CSSThemeClass.Light
 
@@ -124,7 +119,7 @@ limitations under the License.
             viewportStartOffset,
             $bytesPerRow
           ) -
-          (DISPLAYED_DATA_LINES - 1)
+          (NUM_LINES_DISPLAYED - 1)
         : viewport_offset_to_line_num(offset, viewportStartOffset, 
$bytesPerRow)
       $dataFeedAwaitRefresh = true
 
@@ -144,47 +139,6 @@ limitations under the License.
     clearDataDisplays()
   }
 
-  function scrolledToEnd(_: Event) {
-    if ($viewportFollowingByteCount > 0) {
-      // top the display must be the last page of the current viewport, plus 
one line
-      const topOfLastPagePlusOneLine =
-        $viewportEndOffset +
-        $bytesPerRow -
-        $viewportNumLinesDisplayed * $bytesPerRow
-
-      vscode.postMessage({
-        command: MessageCommand.scrollViewport,
-        data: {
-          // scroll the viewport with the desired offset in the middle
-          scrollOffset: $viewportEndOffset - Math.floor($viewportCapacity / 2),
-          bytesPerRow: $bytesPerRow,
-          numLinesDisplayed: $viewportNumLinesDisplayed,
-        },
-      })
-      seek(topOfLastPagePlusOneLine)
-    }
-  }
-
-  function scrolledToTop(_: Event) {
-    if ($viewportStartOffset > 0) {
-      // offset to scroll to after the viewport is scrolled, which should be 
the previous line in the file
-      const topOfFirstPageMinusOneLine = $viewportStartOffset - $bytesPerRow
-      vscode.postMessage({
-        command: MessageCommand.scrollViewport,
-        data: {
-          // scroll the viewport with the desired offset in the middle
-          scrollOffset: Math.max(
-            topOfFirstPageMinusOneLine - Math.floor($viewportCapacity / 2),
-            0
-          ),
-          bytesPerRow: $bytesPerRow,
-          numLinesDisplayed: $viewportNumLinesDisplayed,
-        },
-      })
-      seek(topOfFirstPageMinusOneLine)
-    }
-  }
-
   function seekEventHandler(_: CustomEvent) {
     seek($seekOffset)
   }
@@ -278,6 +232,7 @@ limitations under the License.
     searchQuery.clear()
     clearSearchResultsHighlights()
   }
+
   function handleKeyBind(event: Event) {
     const kbdEvent = event as KeyboardEvent
     if (kbdEvent.key === 'Enter') {
@@ -325,15 +280,6 @@ limitations under the License.
         break
     }
   })
-
-  function scrollBoundaryEventHandler(e: CustomEvent) {
-    if (e.detail.scrolledTop) {
-      scrolledToTop(e)
-    }
-    if (e.detail.scrolledEnd) {
-      scrolledToEnd(e)
-    }
-  }
 </script>
 
 <svelte:window on:keydown|nonpassive={handleKeyBind} />
@@ -350,9 +296,6 @@ limitations under the License.
     on:clearDataDisplays={clearDataDisplays}
     on:applyChanges={custom_apply_changes}
     on:handleEditorEvent={handleEditorEvent}
-    on:scrolledToTop={scrolledToTop}
-    on:scrolledToEnd={scrolledToEnd}
-    on:scrollBoundary={scrollBoundaryEventHandler}
     on:traverse-file={traversalEventHandler}
     on:seek={seekEventHandler}
   />
diff --git a/src/svelte/src/components/layouts/Tooltip.svelte 
b/src/svelte/src/components/layouts/Tooltip.svelte
index c4220f0..dc54251 100644
--- a/src/svelte/src/components/layouts/Tooltip.svelte
+++ b/src/svelte/src/components/layouts/Tooltip.svelte
@@ -15,7 +15,7 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 <script lang="ts">
-  import { tooltipsEnabled } from '../../utilities/display'
+  import { tooltipsEnabled } from '../../stores'
 
   const NULL = () => {}
 
diff --git a/src/svelte/src/stores/configuration.ts 
b/src/svelte/src/stores/configuration.ts
index dc17d57..8b681a1 100644
--- a/src/svelte/src/stores/configuration.ts
+++ b/src/svelte/src/stores/configuration.ts
@@ -15,8 +15,6 @@
  * limitations under the License.
  */
 
-import { writable } from 'svelte/store'
-
 export type Radixes = 'Hexadecimal' | 'Decimal' | 'Octal' | 'Binary'
 
 export type RadixValues = 16 | 10 | 8 | 2
@@ -115,5 +113,3 @@ export const VIEWPORT_CAPACITY_MAX = 16 * 64 // 1024, Ωedit 
maximum viewport si
 export const NUM_LINES_DISPLAYED = 20
 
 export const DATA_PROFILE_MAX_LENGTH = 10_000_000
-
-export const editorActionsAllowed = writable(EditActionRestrictions.None)
diff --git a/src/svelte/src/stores/index.ts b/src/svelte/src/stores/index.ts
index f817c04..6723b89 100644
--- a/src/svelte/src/stores/index.ts
+++ b/src/svelte/src/stores/index.ts
@@ -16,28 +16,32 @@
  */
 
 import type { ValidationResponse } from '../utilities/display'
-import {
-  EditByteModes,
-  UNPRINTABLE_CHAR_STAND_IN,
-  type RadixValues,
-  type BytesPerRow,
-  EditActionRestrictions,
-  editorActionsAllowed,
-} from './configuration'
 import { ThemeType } from '../utilities/colorScheme'
-import { fileMetrics } from '../components/Header/fieldsets/FileMetrics'
+import { FileMetrics } from '../components/Header/fieldsets/FileMetrics'
+import { derived, writable } from 'svelte/store'
+import { SimpleWritable } from './localStore'
+import { ErrorComponentType, ErrorStore } from '../components/Error/Error'
 import {
   radixBytePad,
   regexEditDataTest,
   validateEncodingStr,
 } from '../utilities/display'
-import { derived, writable } from 'svelte/store'
-import { SimpleWritable } from './localStore'
 import {
   BYTE_ACTION_DIV_OFFSET,
-  selectedByte,
-  viewport,
+  ViewportDataStore_t,
+  type ByteValue,
 } from '../components/DataDisplays/CustomByteDisplay/BinaryData'
+import {
+  ReplaceQuery,
+  SearchQuery,
+} from '../components/Header/fieldsets/SearchReplace'
+import {
+  EditByteModes,
+  UNPRINTABLE_CHAR_STAND_IN,
+  type RadixValues,
+  type BytesPerRow,
+  EditActionRestrictions,
+} from './configuration'
 
 export class SelectionData_t {
   startOffset = -1
@@ -107,22 +111,80 @@ export const searchCaseInsensitive = writable(false)
 export const dataFeedLineTop = writable(0)
 export const dataFeedAwaitRefresh = writable(false)
 export const rerenderActionElements = writable(false)
-// data in the viewport
-// export const viewportData = writable(new Uint8Array(0))
 
 // Viewport properties
-export const viewportStartOffset = writable(0)
-export const viewportLength = writable(0)
-export const viewportFollowingByteCount = writable(0)
-export const viewportScrollTop = writable(0)
-export const viewportScrollHeight = writable(0)
-export const viewportClientHeight = writable(0)
-export const viewportCapacity = writable(0)
-export const viewportLineHeight = writable(0)
+export const viewport = new ViewportDataStore_t()
+export const viewportNumLinesDisplayed = writable(20)
+
+export const bytesPerRow = writable(16 as BytesPerRow)
+export const editingByte = writable(false)
+export const selectedByte = writable({
+  text: '',
+  offset: -1,
+  value: -1,
+} as ByteValue)
+
+export const fileMetrics = new FileMetrics()
+
+export const searchQuery = new SearchQuery()
+export const replaceQuery = new ReplaceQuery()
+
+export const searchErr = new ErrorStore(ErrorComponentType.SYMBOL)
+export const replaceErr = new ErrorStore(ErrorComponentType.SYMBOL)
+export const seekErr = new ErrorStore(ErrorComponentType.SYMBOL)
+
+export const editorActionsAllowed = writable(EditActionRestrictions.None)
+export const tooltipsEnabled = writable(false)
+export const sizeHumanReadable = writable(false)
 
 // tracks the start and end offsets of the current selection
 export const selectionDataStore = new SelectionData()
 
+export const searchable = derived(
+  [searchQuery, editorEncoding],
+  ([$searchQuery, $editorEncoding]) => {
+    if ($searchQuery.input.length === 0 || $searchQuery.processing) {
+      searchErr.update(() => {
+        return ''
+      })
+      return false
+    }
+    const ret = validateEncodingStr($searchQuery.input, $editorEncoding, 
'full')
+    searchErr.update(() => {
+      return ret.errMsg
+    })
+    return ret.valid
+  }
+)
+
+export const replaceable = derived(
+  [replaceQuery, editorEncoding, searchable, selectionDataStore],
+  ([$replaceData, $editorEncoding, $searchable, $selectionData]) => {
+    if (
+      $replaceData.input.length < 0 ||
+      !$searchable ||
+      $replaceData.processing
+    ) {
+      replaceErr.update(() => {
+        return ''
+      })
+      return false
+    }
+    if ($selectionData.active) {
+      replaceErr.update(() => {
+        return 'Cannot replace while viewport data is selected'
+      })
+      return false
+    }
+
+    const ret = validateEncodingStr($replaceData.input, $editorEncoding)
+    replaceErr.update(() => {
+      return ret.errMsg
+    })
+    return ret.valid
+  }
+)
+
 // derived readable enumeration that indicates the edit mode (single byte or 
multiple bytes)
 export const editMode = derived(
   selectionDataStore,
@@ -134,41 +196,6 @@ export const editMode = derived(
   EditByteModes.Single
 )
 
-// derived readable number whose value is the number of lines displayed in the 
viewport
-export const viewportNumLinesDisplayed = derived(
-  [viewportClientHeight, viewportLineHeight],
-  ([$viewportClientHeight, $viewportLineHeight]) => {
-    return Math.floor($viewportClientHeight / $viewportLineHeight) + 1
-  }
-)
-
-// derived readable number whose value is the end offset of the current 
viewport
-export const viewportEndOffset = derived(
-  [viewportStartOffset, viewportLength],
-  ([$viewportStartOffset, $viewportLength]) => {
-    return $viewportStartOffset + $viewportLength
-  }
-)
-
-// derived readable boolean that indicates if the viewport is scrolled to the 
top
-export const viewportScrolledToTop = derived(
-  [viewportScrollTop],
-  ([$viewportScrollTop]) => {
-    return $viewportScrollTop === 0
-  }
-)
-
-// derived readable boolean that indicates if the viewport is scrolled to the 
end
-export const viewportScrolledToEnd = derived(
-  [viewportScrollTop, viewportScrollHeight, viewportClientHeight],
-  ([$viewportScrollTop, $viewportScrollHeight, $viewportClientHeight]) => {
-    return (
-      Math.ceil($viewportScrollTop) + $viewportClientHeight >=
-      $viewportScrollHeight
-    )
-  }
-)
-
 // derived readable number whose value is the size of the current data 
selection
 export const selectionSize = derived(
   [selectionDataStore, editorSelection],
@@ -216,11 +243,6 @@ export const editedByteIsOriginalByte = derived(
   }
 )
 
-// derived readable number that indicates the number of encoded bytes per row 
in each viewport
-export const bytesPerRow = derived(displayRadix, ($displayRadix) => {
-  return $displayRadix === 2 ? 8 : (16 as BytesPerRow)
-})
-
 export const viewportColumnWidth = derived(bytesPerRow, (bytesPerRow) => {
   return bytesPerRow * BYTE_ACTION_DIV_OFFSET
 })
@@ -376,10 +398,12 @@ function validRequestableData(
 }
 
 export const dvOffset = derived(
-  [selectionDataStore, addressRadix],
-  ([$selectionData, $addressRadix]) => {
+  [selectionDataStore, addressRadix, viewport],
+  ([$selectionData, $addressRadix, $viewport]) => {
     return $selectionData.active
-      ? $selectionData.startOffset.toString($addressRadix).toUpperCase()
+      ? ($viewport.fileOffset + $selectionData.startOffset)
+          .toString($addressRadix)
+          .toUpperCase()
       : ''
   }
 )
diff --git a/src/svelte/src/utilities/display.ts 
b/src/svelte/src/utilities/display.ts
index 4a9617e..0e2c14f 100644
--- a/src/svelte/src/utilities/display.ts
+++ b/src/svelte/src/utilities/display.ts
@@ -13,19 +13,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import { writable } from 'svelte/store'
 import {
   EditByteModes,
   type BytesPerRow,
   type RadixValues,
 } from '../stores/configuration'
 
-export type ViewportReferences = {
-  physical: HTMLTextAreaElement
-  address: HTMLTextAreaElement
-  logical: HTMLTextAreaElement
-}
-
 export type Viewport = 'physical' | 'address' | 'logical'
 
 export type ValidationResponse = {
@@ -45,29 +38,8 @@ const ByteDivWidths = {
 }
 
 export type BinaryBytePrefix = 'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB'
-export type BinaryBitPrefix = 'b' | 'Kb' | 'Mb' | 'Gb' | 'Tb' | 'Pb'
-type ValidByteOctetCount = 1 | 2 | 3 | 4
-
-export const DISPLAYED_DATA_LINES = 20
-
-export const tooltipsEnabled = writable(false)
-export const sizeHumanReadable = writable(false)
-
-export function viewport_references(
-  viewport?: Viewport
-): ViewportReferences | HTMLTextAreaElement {
-  return viewport
-    ? (document.getElementById(viewport) as HTMLTextAreaElement)
-    : {
-        physical: document.getElementById('physical') as HTMLTextAreaElement,
-        address: document.getElementById('address') as HTMLTextAreaElement,
-        logical: document.getElementById('logical') as HTMLTextAreaElement,
-      }
-}
 
-export function edit_byte_window_ref(): HTMLDivElement {
-  return document.getElementById('editByteWindow') as HTMLDivElement
-}
+export type BinaryBitPrefix = 'b' | 'Kb' | 'Mb' | 'Gb' | 'Tb' | 'Pb'
 
 export function radixBytePad(radix: RadixValues): number {
   switch (radix) {
diff --git a/src/svelte/src/utilities/highlights.ts 
b/src/svelte/src/utilities/highlights.ts
index 51966b0..1ceeb44 100644
--- a/src/svelte/src/utilities/highlights.ts
+++ b/src/svelte/src/utilities/highlights.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { derived, get, readable, writable } from 'svelte/store'
+import { derived, readable, writable } from 'svelte/store'
 import { selectionDataStore } from '../stores'
 
 let selectionHighlightLUT = new Uint8Array(1024)


Reply via email to