From cd1b51618e65340a20fba11445a12e3af49d9325 Mon Sep 17 00:00:00 2001 From: nitin <142569587+ehconitin@users.noreply.github.com> Date: Tue, 14 Oct 2025 22:57:30 +0530 Subject: [PATCH] New resize handle on layout grid (#15040) before - Screenshot 2025-10-12 at 02 14 17 after - Screenshot 2025-10-14 at 18 51 01 --------- Co-authored-by: Lucas Bordeau --- .../components/PageLayoutGridLayout.tsx | 5 ++ .../components/PageLayoutGridResizeHandle.tsx | 55 +++++++++++++++++++ .../display/icon/components/TablerIcons.ts | 1 + packages/twenty-ui/src/display/index.ts | 1 + 4 files changed, 62 insertions(+) create mode 100644 packages/twenty-front/src/modules/page-layout/components/PageLayoutGridResizeHandle.tsx diff --git a/packages/twenty-front/src/modules/page-layout/components/PageLayoutGridLayout.tsx b/packages/twenty-front/src/modules/page-layout/components/PageLayoutGridLayout.tsx index 5382e897ed..505bada369 100644 --- a/packages/twenty-front/src/modules/page-layout/components/PageLayoutGridLayout.tsx +++ b/packages/twenty-front/src/modules/page-layout/components/PageLayoutGridLayout.tsx @@ -1,5 +1,6 @@ import { PageLayoutGridLayoutDragSelector } from '@/page-layout/components/PageLayoutGridLayoutDragSelector'; import { PageLayoutGridOverlay } from '@/page-layout/components/PageLayoutGridOverlay'; +import { PageLayoutGridResizeHandle } from '@/page-layout/components/PageLayoutGridResizeHandle'; import { EMPTY_LAYOUT } from '@/page-layout/constants/EmptyLayout'; import { PAGE_LAYOUT_CONFIG, @@ -115,6 +116,10 @@ export const PageLayoutGridLayout = () => { draggableHandle=".drag-handle" compactType="vertical" preventCollision={false} + resizeHandle={ + isPageLayoutInEditMode ? : undefined + } + resizeHandles={['se']} onLayoutChange={handleLayoutChange} onBreakpointChange={(newBreakpoint) => setPageLayoutCurrentBreakpoint( diff --git a/packages/twenty-front/src/modules/page-layout/components/PageLayoutGridResizeHandle.tsx b/packages/twenty-front/src/modules/page-layout/components/PageLayoutGridResizeHandle.tsx new file mode 100644 index 0000000000..c125a13129 --- /dev/null +++ b/packages/twenty-front/src/modules/page-layout/components/PageLayoutGridResizeHandle.tsx @@ -0,0 +1,55 @@ +import { useTheme } from '@emotion/react'; +import styled from '@emotion/styled'; +import { forwardRef } from 'react'; +import { IconRadiusBottomRight } from 'twenty-ui/display'; + +type PageLayoutGridResizeHandleProps = { + handleAxis?: string; + onMouseDown?: React.MouseEventHandler; + onMouseUp?: React.MouseEventHandler; + onTouchEnd?: React.TouchEventHandler; + className?: string; + style?: React.CSSProperties; +}; + +const StyledIcon = styled(IconRadiusBottomRight)` + bottom: ${({ theme }) => theme.spacing(1)}; + cursor: nwse-resize; + position: absolute; + right: ${({ theme }) => theme.spacing(1)}; + color: ${({ theme }) => theme.border.color.strong}; + + :hover { + color: ${({ theme }) => theme.font.color.tertiary}; + } +`; + +export const PageLayoutGridResizeHandle = forwardRef< + HTMLDivElement, + PageLayoutGridResizeHandleProps +>((props, ref) => { + const theme = useTheme(); + const { + handleAxis = 'se', + onMouseDown, + onMouseUp, + onTouchEnd, + className, + style, + } = props; + + if (handleAxis !== 'se') return null; + + return ( +
+ +
+ ); +}); diff --git a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts index a6f62a76ed..ecfc418f69 100644 --- a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts +++ b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts @@ -272,6 +272,7 @@ export { IconProgressCheck, IconPuzzle, IconQuestionMark, + IconRadiusBottomRight, IconRefresh, IconRefreshAlert, IconRefreshDot, diff --git a/packages/twenty-ui/src/display/index.ts b/packages/twenty-ui/src/display/index.ts index 5c7c674f53..cf9fe6dac5 100644 --- a/packages/twenty-ui/src/display/index.ts +++ b/packages/twenty-ui/src/display/index.ts @@ -334,6 +334,7 @@ export { IconProgressCheck, IconPuzzle, IconQuestionMark, + IconRadiusBottomRight, IconRefresh, IconRefreshAlert, IconRefreshDot,