From eed7ffaf42c6787cf01bfd277bb863b7c4af12c4 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 28 Sep 2026 16:08:57 +0900 Subject: [PATCH] =?UTF-8?q?=EF=BB=BFfeat(cad):=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EB=AC=BC=20=EB=8F=84=EB=A9=B4=20=EB=AF=B8=EB=A6=AC=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=A2=8C=EC=B8=A1=20=ED=8C=A8=EB=84=90=EC=9D=80=20?= =?UTF-8?q?=EC=A0=91=ED=9E=8C=20=EC=B1=84=EB=A1=9C=20=EC=97=B6=20=C2=B7=20?= =?UTF-8?q?=EB=A6=AC=EB=B3=B8=20=EC=A0=91=ED=9E=98=20=EB=AA=A8=EB=93=9C?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=ED=83=AD=EC=9C=BC=EB=A1=9C=20=ED=8E=B8=20?= =?UTF-8?q?=EB=A6=AC=EB=B3=B8=EC=9D=80=20=EB=B0=96=EC=9D=84=20=EB=88=84?= =?UTF-8?q?=EB=A5=B4=EB=A9=B4=20=EB=8B=A4=EC=8B=9C=20=EC=A0=91=ED=9E=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - M02 미리보기: 특성 · 도면층 패널을 숨기던 스타일에서 .cad-inspector 뺌 · load 곁값 panelsCollapsed: true 로 접힌 채 시작(› 누르면 펼침) - cad_host CadLoadExtra · 다리에 panelsCollapsed 칸 · B07 은 안 보냄 = 지금처럼 펼침 - 좌측 패널 접힘 상태를 ui-state 로 옮김 - 리본: 접힘 모드에서 탭 = 도면 위에 겹쳐 잠깐 펼침 · 리본 밖 누름 = 다시 접힘 · 접기 단추 = 고정 펼침 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUypcnp5d1gU2aeKh9F2H7 --- B07_DesignDetail/openwebcad/src/App.css | 6 +++++ .../openwebcad/src/components/Toolbar.tsx | 7 +++--- .../src/integration/aislo-drawing-bridge.ts | 5 +++- .../openwebcad/src/ribbon/Ribbon.tsx | 25 ++++++++++++++++--- .../M02_MasterTemplete_Drawing.ts | 3 +++ .../M02_MasterTemplete_Structure.ts | 4 +-- resources/tester/test_m02_structure_panel.py | 20 +++++++++++++++ ui_template/cad_host/cad_host.ts | 2 ++ 8 files changed, 62 insertions(+), 10 deletions(-) diff --git a/B07_DesignDetail/openwebcad/src/App.css b/B07_DesignDetail/openwebcad/src/App.css index 62b2b8d4..84797833 100644 --- a/B07_DesignDetail/openwebcad/src/App.css +++ b/B07_DesignDetail/openwebcad/src/App.css @@ -151,6 +151,12 @@ body > canvas[data-id="canvas"] { border-bottom: 1px solid var(--cad-line); transition: height 120ms ease; } +/* 접힘 모드에서 탭으로 잠깐 펼침 — 도면 자리는 그대로 두고 위에 겹쳐 뜸(122px = 펼친 리본 높이) */ +.cad-ribbon[data-peek="true"] { + z-index: 10; + height: 122px; + box-shadow: var(--shadow-lg); +} .cad-ribbon-tabs { display: flex; gap: 2px; diff --git a/B07_DesignDetail/openwebcad/src/components/Toolbar.tsx b/B07_DesignDetail/openwebcad/src/components/Toolbar.tsx index 426d4bbf..67e6dc26 100644 --- a/B07_DesignDetail/openwebcad/src/components/Toolbar.tsx +++ b/B07_DesignDetail/openwebcad/src/components/Toolbar.tsx @@ -12,7 +12,7 @@ import { QuickAccessBar } from './QuickAccessBar'; import { Ribbon } from '../ribbon/Ribbon'; import { StatusBar } from './StatusBar'; import { useCadRefresh } from './use-cad-refresh'; -import { isRibbonCollapsed } from './ui-state'; +import { isInspectorCollapsed, isRibbonCollapsed, setInspectorCollapsed } from './ui-state'; import { getActiveToolActor } from '../state'; import type { Tool } from '../tools'; import { ViewControls } from './ViewControls'; @@ -20,11 +20,12 @@ import { DropHint } from './DropHint'; export const Toolbar: FC = () => { useCadRefresh(); - const [panelCollapsed, setPanelCollapsed] = useState(false); const [commandLineVisible, setCommandLineVisible] = useState(false); const activeTool = (getActiveToolActor()?.getSnapshot()?.context?.type ?? null) as Tool | null; const ribbonCollapsed = isRibbonCollapsed(); + // 좌측 패널 접힘 — 호스트(M02 미리보기)가 접힌 채로 실을 수 있게 ui-state 에 둔다 + const panelCollapsed = isInspectorCollapsed(); useEffect(() => { // 편 상태의 폭은 App.css의 `--cad-panel-width` 기본값을 쓴다. 여기 숫자를 박아 @@ -54,7 +55,7 @@ export const Toolbar: FC = () => { /> setPanelCollapsed((value) => !value)} + onToggleCollapsed={() => setInspectorCollapsed(!panelCollapsed)} /> diff --git a/B07_DesignDetail/openwebcad/src/integration/aislo-drawing-bridge.ts b/B07_DesignDetail/openwebcad/src/integration/aislo-drawing-bridge.ts index b42e3130..6eef848b 100644 --- a/B07_DesignDetail/openwebcad/src/integration/aislo-drawing-bridge.ts +++ b/B07_DesignDetail/openwebcad/src/integration/aislo-drawing-bridge.ts @@ -25,7 +25,7 @@ import { setHostTitle, setLayers, } from '../state.ts'; -import { setRibbonCollapsed } from '../components/ui-state.ts'; +import { setInspectorCollapsed, setRibbonCollapsed } from '../components/ui-state.ts'; import { toast } from 'react-toastify'; import { runCommandInput } from '../commands/run-command.ts'; import { setRecoveryScope } from '../helpers/autosave.ts'; @@ -60,6 +60,8 @@ interface DrawingLoadMessage { hostSave?: boolean; /** 리본을 접힌 채로 여는가 — 없으면(B07) 펼침 그대로. */ ribbonCollapsed?: boolean; + /** 좌측 패널(특성 · 도면층)을 접힌 채로 여는가 — 없으면(B07) 지금 상태 그대로. */ + panelsCollapsed?: boolean; } interface DrawingSaveRequestMessage { @@ -211,6 +213,7 @@ export function registerAisloDrawingBridge() { setHostTitle(event.data.hostTitle ?? 'B07 상세 설계'); setHostSave(event.data.hostSave === true); setRibbonCollapsed(event.data.ribbonCollapsed === true); + if (event.data.panelsCollapsed) setInspectorCollapsed(true); if (event.data.frameEdit) applyFramePreview(); // 앞 도면에서 켜 둔 그리기 도구를 내린다. 안 내리면 **확정한 도면 위에도** // 그 도구가 계속 그린다 — 읽기 전용은 새 명령만 막기 때문이다(2026-09-01 실측: diff --git a/B07_DesignDetail/openwebcad/src/ribbon/Ribbon.tsx b/B07_DesignDetail/openwebcad/src/ribbon/Ribbon.tsx index b46d3c77..4afe48c3 100644 --- a/B07_DesignDetail/openwebcad/src/ribbon/Ribbon.tsx +++ b/B07_DesignDetail/openwebcad/src/ribbon/Ribbon.tsx @@ -153,6 +153,20 @@ export const Ribbon: FC = ({ activeTool, widgets, onCommandRun }) = const activeTabId = getActiveRibbonTab(); const activeTab = RIBBON_TABS.find((tab) => tab.id === activeTabId) ?? RIBBON_TABS[0]; const collapsed = isRibbonCollapsed(); + // 접힘 모드에서 탭을 누르면 잠깐 펼침(도면 위에 겹쳐 뜸) — 리본 밖을 누르면 다시 접힘 + // (오피스 「리본 자동 숨기기」). 접기 단추로 펼치면 고정 펼침. + const [peek, setPeek] = useState(false); + const navRef = useRef(null); + const peeking = collapsed && peek; + + useEffect(() => { + if (!peeking) return; + const close = (event: PointerEvent) => { + if (!navRef.current?.contains(event.target as Node)) setPeek(false); + }; + window.addEventListener('pointerdown', close, true); + return () => window.removeEventListener('pointerdown', close, true); + }, [peeking]); const handleRun = (command: CadCommand) => { runCommand(command); @@ -160,7 +174,7 @@ export const Ribbon: FC = ({ activeTool, widgets, onCommandRun }) = }; return ( -