From 41736c3ac4aea2f9f2bef2cd09a89728d2e6feee Mon Sep 17 00:00:00 2001 From: karishmas6 Date: Fri, 14 Jun 2024 21:48:23 +0530 Subject: [PATCH] feat: element highlighter --- src/components/atoms/Highlighter.tsx | 127 +++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/components/atoms/Highlighter.tsx diff --git a/src/components/atoms/Highlighter.tsx b/src/components/atoms/Highlighter.tsx new file mode 100644 index 00000000..50e28ec5 --- /dev/null +++ b/src/components/atoms/Highlighter.tsx @@ -0,0 +1,127 @@ +import React from 'react'; + +import styled from "styled-components"; +import { mapRect } from "../../helpers/inputHelpers"; +import canvas from "./canvas"; + +interface HighlighterProps { + unmodifiedRect: DOMRect; + displayedSelector: string; + width: number; + height: number; + canvasRect: DOMRect; +}; + +export const Highlighter = ({ unmodifiedRect, displayedSelector = '', width, height, canvasRect}: HighlighterProps) => { + if (!unmodifiedRect) { + return null; + } else { + // const unshiftedRect = mapRect(unmodifiedRect, width, height); + // console.log('unshiftedRect', unshiftedRect) + // const rect = { + // bottom: unshiftedRect.bottom + canvasRect.top, + // top: unshiftedRect.top + canvasRect.top, + // left: unshiftedRect.left + canvasRect.left, + // right: unshiftedRect.right + canvasRect.left, + // x: unshiftedRect.x + canvasRect.left, + // y: unshiftedRect.y + canvasRect.top, + // width: unshiftedRect.width, + // height: unshiftedRect.height, + // } + + const rect = { + top: unmodifiedRect.top + canvasRect.top, + left: unmodifiedRect.left + canvasRect.left, + right: unmodifiedRect.right + canvasRect.left, + bottom: unmodifiedRect.bottom + canvasRect.top, + width: unmodifiedRect.width, + height: unmodifiedRect.height, + }; + + const adjustedWidth = Math.min(rect.width, width - rect.left); // Adjust width if it extends beyond canvas boundary + const adjustedHeight = Math.min(rect.height, height - rect.top); // Adjust height if it extends beyond canvas boundary + + console.log('unmodifiedRect:', unmodifiedRect) + console.log('rectangle:', rect) + console.log('canvas rectangle:', canvasRect) + + // make the highlighting rectangle stay in browser window boundaries + // if (rect.bottom > canvasRect.bottom) { + // rect.height = height - unshiftedRect.top; + // } + + // if (rect.top < canvasRect.top) { + // rect.height = rect.height - (canvasRect.top - rect.top); + // rect.top = canvasRect.top; + // } + + // if (rect.right > canvasRect.right) { + // rect.width = width - unshiftedRect.left; + // } + + // if (rect.left < canvasRect.left) { + // rect.width = rect.width - (canvasRect.left - rect.left); + // rect.left = canvasRect.left; + // } + + + return ( +
+ + + {displayedSelector} + +
+ ); + } +} + +const HighlighterOutline = styled.div` + box-sizing: border-box; + pointer-events: none !important; + position: fixed !important; + background: #ff5d5b26 !important; + outline: 4px solid pink !important; + // border: 4px solid #ff5d5b !important; + z-index: 2147483647 !important; + // border-radius: 5px; + top: ${(p: HighlighterOutlineProps) => p.top}px; + left: ${(p: HighlighterOutlineProps) => p.left}px; + width: ${(p: HighlighterOutlineProps) => p.width}px; + height: ${(p: HighlighterOutlineProps) => p.height}px; +`; + +const HighlighterLabel = styled.div` + pointer-events: none !important; + position: fixed !important; + background: #080a0b !important; + color: white !important; + padding: 8px !important; + font-family: monospace !important; + border-radius: 5px !important; + z-index: 2147483647 !important; + top: ${(p: HighlighterLabelProps) => p.top}px; + left: ${(p: HighlighterLabelProps) => p.left}px; +`; + +interface HighlighterLabelProps{ + top: number; + left: number; +} + +interface HighlighterOutlineProps { + top: number; + left: number; + width: number; + height: number; +}