From 1eb579e7a8704ecc6902bc4c48de0e9014d117c3 Mon Sep 17 00:00:00 2001
From: Monika Stefanova <monik.stefanova@gmail.com>
Date: Thu, 27 Mar 2025 19:29:20 +0100
Subject: [PATCH 1/8] Creating rectangle low wireframe shape

---
 public/low-wireframes/rectangleLow.svg        |  3 +
 .../front-low-wireframes-components/index.ts  |  1 +
 .../rectangle-low-shape.tsx                   | 61 +++++++++++++++++++
 src/core/model/index.ts                       |  4 +-
 src/pods/canvas/model/shape-size.mapper.ts    |  2 +
 src/pods/canvas/shape-renderer/index.tsx      |  3 +
 .../simple-low-wireframes-components/index.ts |  1 +
 .../rectangle-low.renderer.tsx                | 31 ++++++++++
 .../low-wireframe-gallery-data/index.ts       |  4 ++
 9 files changed, 109 insertions(+), 1 deletion(-)
 create mode 100644 public/low-wireframes/rectangleLow.svg
 create mode 100644 src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx
 create mode 100644 src/pods/canvas/shape-renderer/simple-low-wireframes-components/rectangle-low.renderer.tsx

diff --git a/public/low-wireframes/rectangleLow.svg b/public/low-wireframes/rectangleLow.svg
new file mode 100644
index 00000000..642807a7
--- /dev/null
+++ b/public/low-wireframes/rectangleLow.svg
@@ -0,0 +1,3 @@
+<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" fill="none" stroke="black" stroke-width="6">
+  <rect width="200" height="200" stroke="black" fill="none"/>
+</svg>
\ No newline at end of file
diff --git a/src/common/components/mock-components/front-low-wireframes-components/index.ts b/src/common/components/mock-components/front-low-wireframes-components/index.ts
index b06f4678..02bcc7e4 100644
--- a/src/common/components/mock-components/front-low-wireframes-components/index.ts
+++ b/src/common/components/mock-components/front-low-wireframes-components/index.ts
@@ -2,3 +2,4 @@ export * from './ellipse-low-shape';
 export * from './horizontal-line-low-shape';
 export * from './image-placeholder-shape';
 export * from './vertical-line-low-shape';
+export * from './rectangle-low-shape';
diff --git a/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx b/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx
new file mode 100644
index 00000000..f9f0082a
--- /dev/null
+++ b/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx
@@ -0,0 +1,61 @@
+import { ShapeSizeRestrictions, ShapeType } from '@/core/model';
+import { forwardRef } from 'react';
+import { ShapeProps } from '../shape.model';
+import { fitSizeToShapeSizeRestrictions } from '@/common/utils/shapes';
+import { Group, Rect } from 'react-konva';
+import { useGroupShapeProps } from '../mock-components.utils';
+
+const rectangleLowShapeRestriction: ShapeSizeRestrictions = {
+  minWidth: 10,
+  minHeight: 10,
+  maxWidth: -1,
+  maxHeight: -1,
+  defaultWidth: 160,
+  defaultHeight: 160,
+};
+
+export const getRectangleLowShapeRestrictions = (): ShapeSizeRestrictions =>
+  rectangleLowShapeRestriction;
+
+const shapeType: ShapeType = 'rectangleLow';
+
+export const RectangleLowShape = forwardRef<any, ShapeProps>((props, ref) => {
+  const {
+    x,
+    y,
+    width,
+    height,
+    id,
+    onSelected,
+    text,
+    otherProps,
+    ...shapeProps
+  } = props;
+
+  const restrictedSize = fitSizeToShapeSizeRestrictions(
+    rectangleLowShapeRestriction,
+    width,
+    height
+  );
+
+  const { width: restrictedWidth, height: restrictedHeight } = restrictedSize;
+
+  const commonGroupProps = useGroupShapeProps(
+    props,
+    restrictedSize,
+    shapeType,
+    ref
+  );
+
+  return (
+    <Group {...commonGroupProps} {...shapeProps}>
+      <Rect
+        width={restrictedWidth}
+        height={restrictedHeight}
+        stroke="black"
+        strokeWidth={6}
+        fill="white"
+      />
+    </Group>
+  );
+});
diff --git a/src/core/model/index.ts b/src/core/model/index.ts
index 3d7c4ef0..826eabcc 100644
--- a/src/core/model/index.ts
+++ b/src/core/model/index.ts
@@ -80,7 +80,8 @@ export type ShapeType =
   | 'imagePlaceholder'
   | 'horizontalLineLow'
   | 'verticalLineLow'
-  | 'ellipseLow';
+  | 'ellipseLow'
+  | 'rectangleLow';
 
 export const ShapeDisplayName: Record<ShapeType, string> = {
   multiple: 'multiple',
@@ -150,6 +151,7 @@ export const ShapeDisplayName: Record<ShapeType, string> = {
   horizontalLineLow: 'Horizontal Divider',
   verticalLineLow: 'Vertical Divider',
   ellipseLow: 'Ellipse',
+  rectangleLow: 'Rectangle Placeholder',
 };
 
 export type EditType = 'input' | 'textarea' | 'imageupload';
diff --git a/src/pods/canvas/model/shape-size.mapper.ts b/src/pods/canvas/model/shape-size.mapper.ts
index 7f634020..40cab0a5 100644
--- a/src/pods/canvas/model/shape-size.mapper.ts
+++ b/src/pods/canvas/model/shape-size.mapper.ts
@@ -83,6 +83,7 @@ import {
   getHorizontalLineLowShapeRestrictions,
   getImagePlaceholderShapeSizeRestrictions,
   getVerticalLineLowShapeRestrictions,
+  getRectangleLowShapeRestrictions,
 } from '@/common/components/mock-components/front-low-wireframes-components';
 
 const getMultipleNodeSizeRestrictions = (): ShapeSizeRestrictions => ({
@@ -163,6 +164,7 @@ const shapeSizeMap: Record<ShapeType, () => ShapeSizeRestrictions> = {
   horizontalLineLow: getHorizontalLineLowShapeRestrictions,
   verticalLineLow: getVerticalLineLowShapeRestrictions,
   ellipseLow: getEllipseLowShapeRestrictions,
+  rectangleLow: getRectangleLowShapeRestrictions,
 };
 
 export default shapeSizeMap;
diff --git a/src/pods/canvas/shape-renderer/index.tsx b/src/pods/canvas/shape-renderer/index.tsx
index c761ab9e..94d115fa 100644
--- a/src/pods/canvas/shape-renderer/index.tsx
+++ b/src/pods/canvas/shape-renderer/index.tsx
@@ -78,6 +78,7 @@ import {
   renderImagePlaceHolder,
   renderVerticalLowLine,
   renderEllipseLow,
+  renderRectangleLow,
 } from './simple-low-wireframes-components';
 
 export const renderShapeComponent = (
@@ -217,6 +218,8 @@ export const renderShapeComponent = (
       return renderVerticalLowLine(shape, shapeRenderedProps);
     case 'ellipseLow':
       return renderEllipseLow(shape, shapeRenderedProps);
+    case 'rectangleLow':
+      return renderRectangleLow(shape, shapeRenderedProps);
     default:
       return renderNotFound(shape, shapeRenderedProps);
   }
diff --git a/src/pods/canvas/shape-renderer/simple-low-wireframes-components/index.ts b/src/pods/canvas/shape-renderer/simple-low-wireframes-components/index.ts
index 3687a514..124da30b 100644
--- a/src/pods/canvas/shape-renderer/simple-low-wireframes-components/index.ts
+++ b/src/pods/canvas/shape-renderer/simple-low-wireframes-components/index.ts
@@ -2,3 +2,4 @@ export * from './ellipse-low.renderer';
 export * from './image-placeholder.renderer';
 export * from './low-horizontal-line.renderer';
 export * from './low-vertical-line.renderer';
+export * from './rectangle-low.renderer';
diff --git a/src/pods/canvas/shape-renderer/simple-low-wireframes-components/rectangle-low.renderer.tsx b/src/pods/canvas/shape-renderer/simple-low-wireframes-components/rectangle-low.renderer.tsx
new file mode 100644
index 00000000..9fe27c44
--- /dev/null
+++ b/src/pods/canvas/shape-renderer/simple-low-wireframes-components/rectangle-low.renderer.tsx
@@ -0,0 +1,31 @@
+import { ShapeModel } from '@/core/model';
+import { ShapeRendererProps } from '../model';
+import { RectangleLowShape } from '@/common/components/mock-components/front-low-wireframes-components';
+
+export const renderRectangleLow = (
+  shape: ShapeModel,
+  shapeRenderedProps: ShapeRendererProps
+) => {
+  const { handleSelected, shapeRefs, handleDragEnd, handleTransform } =
+    shapeRenderedProps;
+
+  return (
+    <RectangleLowShape
+      id={shape.id}
+      key={shape.id}
+      ref={shapeRefs.current[shape.id]}
+      x={shape.x}
+      y={shape.y}
+      name="shape"
+      width={shape.width}
+      height={shape.height}
+      draggable
+      typeOfTransformer={shape.typeOfTransformer}
+      onSelected={handleSelected}
+      onDragEnd={handleDragEnd(shape.id)}
+      onTransform={handleTransform}
+      onTransformEnd={handleTransform}
+      otherProps={shape.otherProps}
+    />
+  );
+};
diff --git a/src/pods/galleries/low-wireframe-gallery/low-wireframe-gallery-data/index.ts b/src/pods/galleries/low-wireframe-gallery/low-wireframe-gallery-data/index.ts
index 2da8c34f..038d725f 100644
--- a/src/pods/galleries/low-wireframe-gallery/low-wireframe-gallery-data/index.ts
+++ b/src/pods/galleries/low-wireframe-gallery/low-wireframe-gallery-data/index.ts
@@ -17,4 +17,8 @@ export const mockLowWireframeCollection: ItemInfo[] = [
     thumbnailSrc: '/low-wireframes/ellipseLow.svg',
     type: 'ellipseLow',
   },
+  {
+    thumbnailSrc: '/low-wireframes/rectangleLow.svg',
+    type: 'rectangleLow',
+  },
 ];

From 7a7b47a5aa7d30208940a5c6280e6d22ff69cb80 Mon Sep 17 00:00:00 2001
From: Monika Stefanova <monik.stefanova@gmail.com>
Date: Thu, 27 Mar 2025 19:41:28 +0100
Subject: [PATCH 2/8] adding other props

---
 .../rectangle-low-shape.tsx                                | 7 ++++++-
 src/pods/canvas/model/shape-other-props.utils.ts           | 1 +
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx b/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx
index f9f0082a..80f560c8 100644
--- a/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx
+++ b/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx
@@ -4,6 +4,8 @@ import { ShapeProps } from '../shape.model';
 import { fitSizeToShapeSizeRestrictions } from '@/common/utils/shapes';
 import { Group, Rect } from 'react-konva';
 import { useGroupShapeProps } from '../mock-components.utils';
+import { useShapeProps } from '../../shapes/use-shape-props.hook';
+import { BASIC_SHAPE } from '../front-components/shape.const';
 
 const rectangleLowShapeRestriction: ShapeSizeRestrictions = {
   minWidth: 10,
@@ -40,6 +42,8 @@ export const RectangleLowShape = forwardRef<any, ShapeProps>((props, ref) => {
 
   const { width: restrictedWidth, height: restrictedHeight } = restrictedSize;
 
+  const { stroke, strokeStyle } = useShapeProps(otherProps, BASIC_SHAPE);
+
   const commonGroupProps = useGroupShapeProps(
     props,
     restrictedSize,
@@ -52,7 +56,8 @@ export const RectangleLowShape = forwardRef<any, ShapeProps>((props, ref) => {
       <Rect
         width={restrictedWidth}
         height={restrictedHeight}
-        stroke="black"
+        stroke={stroke}
+        dash={strokeStyle}
         strokeWidth={6}
         fill="white"
       />
diff --git a/src/pods/canvas/model/shape-other-props.utils.ts b/src/pods/canvas/model/shape-other-props.utils.ts
index a319a05e..a5dd36ae 100644
--- a/src/pods/canvas/model/shape-other-props.utils.ts
+++ b/src/pods/canvas/model/shape-other-props.utils.ts
@@ -123,6 +123,7 @@ export const generateDefaultOtherProps = (
       };
     case 'horizontalLine':
     case 'horizontalLineLow':
+    case 'rectangleLow':
     case 'verticalLineLow':
     case 'ellipseLow':
       return {

From a64b554904fef1023c014d621e426ab1e161ac16 Mon Sep 17 00:00:00 2001
From: Monika Stefanova <monik.stefanova@gmail.com>
Date: Thu, 27 Mar 2025 19:46:40 +0100
Subject: [PATCH 3/8] change ShapeDisplayName

---
 src/core/model/index.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/core/model/index.ts b/src/core/model/index.ts
index 826eabcc..6d86c6b8 100644
--- a/src/core/model/index.ts
+++ b/src/core/model/index.ts
@@ -151,7 +151,7 @@ export const ShapeDisplayName: Record<ShapeType, string> = {
   horizontalLineLow: 'Horizontal Divider',
   verticalLineLow: 'Vertical Divider',
   ellipseLow: 'Ellipse',
-  rectangleLow: 'Rectangle Placeholder',
+  rectangleLow: 'Rectangle',
 };
 
 export type EditType = 'input' | 'textarea' | 'imageupload';

From 7871f4305355fd8f13665034e2e2fb46f5dd50c9 Mon Sep 17 00:00:00 2001
From: Monika Stefanova <monik.stefanova@gmail.com>
Date: Thu, 27 Mar 2025 20:07:56 +0100
Subject: [PATCH 4/8] rectangle getByAlt

---
 src/core/model/index.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/core/model/index.ts b/src/core/model/index.ts
index 6d86c6b8..9d811e70 100644
--- a/src/core/model/index.ts
+++ b/src/core/model/index.ts
@@ -151,7 +151,7 @@ export const ShapeDisplayName: Record<ShapeType, string> = {
   horizontalLineLow: 'Horizontal Divider',
   verticalLineLow: 'Vertical Divider',
   ellipseLow: 'Ellipse',
-  rectangleLow: 'Rectangle',
+  rectangleLow: 'Low rectangle',
 };
 
 export type EditType = 'input' | 'textarea' | 'imageupload';

From 8918af0598dcfe843cbf46dd3cc89e8fc0e55299 Mon Sep 17 00:00:00 2001
From: Monika Stefanova <monik.stefanova@gmail.com>
Date: Thu, 27 Mar 2025 20:18:22 +0100
Subject: [PATCH 5/8] fixing rectangle issue

---
 src/core/model/index.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/core/model/index.ts b/src/core/model/index.ts
index 9d811e70..378ae59e 100644
--- a/src/core/model/index.ts
+++ b/src/core/model/index.ts
@@ -151,7 +151,7 @@ export const ShapeDisplayName: Record<ShapeType, string> = {
   horizontalLineLow: 'Horizontal Divider',
   verticalLineLow: 'Vertical Divider',
   ellipseLow: 'Ellipse',
-  rectangleLow: 'Low rectangle',
+  rectangleLow: 'Low square',
 };
 
 export type EditType = 'input' | 'textarea' | 'imageupload';

From 40917626681aae1bffe75e7cb95064b2282e64cd Mon Sep 17 00:00:00 2001
From: Monika Stefanova <monik.stefanova@gmail.com>
Date: Thu, 27 Mar 2025 20:25:03 +0100
Subject: [PATCH 6/8] Changing AltText from Rectangle to Square

---
 src/core/model/index.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/core/model/index.ts b/src/core/model/index.ts
index 378ae59e..5b55794d 100644
--- a/src/core/model/index.ts
+++ b/src/core/model/index.ts
@@ -151,7 +151,7 @@ export const ShapeDisplayName: Record<ShapeType, string> = {
   horizontalLineLow: 'Horizontal Divider',
   verticalLineLow: 'Vertical Divider',
   ellipseLow: 'Ellipse',
-  rectangleLow: 'Low square',
+  rectangleLow: 'Square Placeholder',
 };
 
 export type EditType = 'input' | 'textarea' | 'imageupload';

From a61775f694268083a465afab100fae3ca95f3083 Mon Sep 17 00:00:00 2001
From: Monika Stefanova <monik.stefanova@gmail.com>
Date: Thu, 27 Mar 2025 20:34:19 +0100
Subject: [PATCH 7/8] fix e2e rectangle test

---
 e2e/rectangle-shape.spec.ts | 4 ++--
 src/core/model/index.ts     | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/e2e/rectangle-shape.spec.ts b/e2e/rectangle-shape.spec.ts
index be35ae18..3e56bf85 100644
--- a/e2e/rectangle-shape.spec.ts
+++ b/e2e/rectangle-shape.spec.ts
@@ -12,13 +12,13 @@ test('has rectangle component', async ({ page }) => {
   await page.goto('');
   await page.getByText('Basic Shapes').click();
 
-  await expect(page.getByAltText('Rectangle')).toBeVisible();
+  await expect(page.getByAltText(/^Rectangle$/)).toBeVisible();
 });
 
 test('can add rectangle component to canvas', async ({ page }) => {
   await page.goto('');
   await page.getByText('Basic Shapes').click();
-  const component = page.getByAltText('Rectangle');
+  const component = page.getByAltText(/^Rectangle$/);
 
   const position = await getLocatorPosition(component);
   await dragAndDrop(page, position, {
diff --git a/src/core/model/index.ts b/src/core/model/index.ts
index 5b55794d..826eabcc 100644
--- a/src/core/model/index.ts
+++ b/src/core/model/index.ts
@@ -151,7 +151,7 @@ export const ShapeDisplayName: Record<ShapeType, string> = {
   horizontalLineLow: 'Horizontal Divider',
   verticalLineLow: 'Vertical Divider',
   ellipseLow: 'Ellipse',
-  rectangleLow: 'Square Placeholder',
+  rectangleLow: 'Rectangle Placeholder',
 };
 
 export type EditType = 'input' | 'textarea' | 'imageupload';

From e0d8dabab66781735219d65ce52a3f0bb5bd436b Mon Sep 17 00:00:00 2001
From: Braulio <braulio.diez@gmail.com>
Date: Sat, 29 Mar 2025 18:42:51 +0100
Subject: [PATCH 8/8] update rectangle thumbnail

---
 public/low-wireframes/rectangleLow.svg | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/public/low-wireframes/rectangleLow.svg b/public/low-wireframes/rectangleLow.svg
index 642807a7..bfe76d05 100644
--- a/public/low-wireframes/rectangleLow.svg
+++ b/public/low-wireframes/rectangleLow.svg
@@ -1,3 +1,3 @@
-<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" fill="none" stroke="black" stroke-width="6">
-  <rect width="200" height="200" stroke="black" fill="none"/>
+<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
+  <rect x="10" y="10" width="180" height="180" stroke="black" stroke-width="4" fill="none"/>
 </svg>
\ No newline at end of file