From 41637d3985664107edc4783b70b12be8eddb8a64 Mon Sep 17 00:00:00 2001 From: Sambhav Rana <89438969+sambhavnrana@users.noreply.github.com> Date: Fri, 1 Nov 2024 00:58:24 +0530 Subject: [PATCH] Insert element at index (#697) --- .../preload/webview/elements/dom/insert.ts | 37 +++++++++++++++++- bun.lockb | Bin 426688 -> 426888 bytes 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/apps/studio/electron/preload/webview/elements/dom/insert.ts b/apps/studio/electron/preload/webview/elements/dom/insert.ts index 7b43dcb2c..a10d1056d 100644 --- a/apps/studio/electron/preload/webview/elements/dom/insert.ts +++ b/apps/studio/electron/preload/webview/elements/dom/insert.ts @@ -6,16 +6,49 @@ import { InsertPos } from '@onlook/models/editor'; import type { ActionElement, ActionElementLocation } from '@onlook/models/actions'; import type { DomElement } from '@onlook/models/element'; +function findClosestIndex(container: HTMLElement, y: number): number { + const children = Array.from(container.children); + + if (children.length === 0) { + return 0; + } + + let closestIndex = 0; + + let minDistance = Infinity; + + children.forEach((child, index) => { + const rect = child.getBoundingClientRect(); + + const childMiddle = rect.top + rect.height / 2; + + const distance = Math.abs(y - childMiddle); + + if (distance < minDistance) { + minDistance = distance; + closestIndex = index; + } + }); + + const closestRect = children[closestIndex].getBoundingClientRect(); + + const closestMiddle = closestRect.top + closestRect.height / 2; + + return y > closestMiddle ? closestIndex + 1 : closestIndex; +} + export function getInsertLocation(x: number, y: number): ActionElementLocation | undefined { const targetEl = findNearestBlockLevelContainer(x, y); if (!targetEl) { return; } const targetSelector = getUniqueSelector(targetEl); + const display = window.getComputedStyle(targetEl).display; + const isStackOrGrid = display === 'flex' || display === 'grid'; const location: ActionElementLocation = { - position: InsertPos.APPEND, + position: isStackOrGrid ? InsertPos.INDEX : InsertPos.APPEND, targetSelector: targetSelector, - index: -1, + index: isStackOrGrid ? findClosestIndex(targetEl, y) : -1, }; return location; } diff --git a/bun.lockb b/bun.lockb index 30a43c36b5f890365312e89430cc6d857a41d200..cc555536fbdb5cc0130bd94c0b83152fa0658ed5 100755 GIT binary patch delta 23220 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 delta 23079 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 VsW!Rzm@2P^alew$lZzXr{|mlguGjzo