diff --git a/frontend/components/screen/ResponsiveGridRenderer.tsx b/frontend/components/screen/ResponsiveGridRenderer.tsx
index 00e0dc53..c718c70e 100644
--- a/frontend/components/screen/ResponsiveGridRenderer.tsx
+++ b/frontend/components/screen/ResponsiveGridRenderer.tsx
@@ -370,7 +370,46 @@ export function ResponsiveGridRenderer({
const { normalComps } = processedRow;
const allButtons = normalComps.every((c) => isButtonComponent(c));
- const gap = isMobile ? 8 : allButtons ? 8 : getRowGap(normalComps, canvasWidth);
+
+ // 데스크톱에서 버튼만 있는 행: 디자이너의 x, width를 비율로 적용
+ if (allButtons && normalComps.length > 0 && !isMobile) {
+ const rowHeight = Math.max(...normalComps.map(c => c.size?.height || 40));
+
+ return (
+
0 ? `${rowMarginTop}px` : undefined,
+ }}
+ >
+ {normalComps.map((component) => {
+ const typeId = getComponentTypeId(component);
+ const leftPct = (component.position.x / canvasWidth) * 100;
+ const widthPct = ((component.size?.width || 90) / canvasWidth) * 100;
+
+ return (
+
+ {renderComponent(component)}
+
+ );
+ })}
+
+ );
+ }
+
+ const gap = isMobile ? 8 : getRowGap(normalComps, canvasWidth);
const hasFlexHeightComp = normalComps.some((c) => {
const h = c.size?.height || 0;
@@ -382,7 +421,6 @@ export function ResponsiveGridRenderer({
key={`row-${rowIndex}`}
className={cn(
"flex w-full flex-wrap overflow-hidden",
- allButtons && "justify-end px-2 py-1",
hasFlexHeightComp ? "min-h-0 flex-1" : "flex-shrink-0"
)}
style={{ gap: `${gap}px`, marginTop: rowMarginTop > 0 ? `${rowMarginTop}px` : undefined }}
diff --git a/frontend/components/v2/config-panels/V2SplitPanelLayoutConfigPanel.tsx b/frontend/components/v2/config-panels/V2SplitPanelLayoutConfigPanel.tsx
index a490d6b6..ae5679b6 100644
--- a/frontend/components/v2/config-panels/V2SplitPanelLayoutConfigPanel.tsx
+++ b/frontend/components/v2/config-panels/V2SplitPanelLayoutConfigPanel.tsx
@@ -157,10 +157,13 @@ function SortableColumnRow({
/>
onWidthChange(parseInt(e.target.value) || 100)}
- placeholder="너비"
+ onChange={(e) => onWidthChange(parseInt(e.target.value) || 20)}
+ placeholder="20"
className="h-6 w-14 shrink-0 text-xs"
+ min={5}
+ max={100}
/>
+ %
{isNumeric && (