From b4fb16308984e6202128ecb6a719307e2ec4d153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=97=B0=EC=9A=B0?= Date: Wed, 15 Jul 2026 23:48:35 +0900 Subject: [PATCH 01/11] =?UTF-8?q?docs:=20=ED=83=AD=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?Undo=20=EA=B2=BD=EA=B3=84=20=EC=A0=95=EC=B1=85=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/components/main/Modal/content/settings/TabList.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/components/main/Modal/content/settings/TabList.tsx b/src/renderer/components/main/Modal/content/settings/TabList.tsx index 79153b0e..ee4ca08d 100644 --- a/src/renderer/components/main/Modal/content/settings/TabList.tsx +++ b/src/renderer/components/main/Modal/content/settings/TabList.tsx @@ -57,6 +57,8 @@ const TabList = ({ onClose: _onClose }: TabListProps) => { } }; + // 탭 삭제는 의도적으로 Undo 경계를 만들지 않음 — 확인창이 방어선 (1.2.x부터) + // 다른 편집의 Undo 스냅샷에는 탭이 포함돼 결합 복원됨 (1.6.0부터) — 기록 누락 버그로 오판 금지 const handleDelete = async () => { try { const result = await window.api.keys.customTabs.delete(selectedKeyType); From 92215247c83a7979d449e7e82baad860c32ac760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=97=B0=EC=9A=B0?= Date: Wed, 15 Jul 2026 23:48:35 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20=EA=B8=80=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B8=94=EB=9F=AC=20=EB=B0=98=EA=B2=BD=20=EC=83=81=ED=96=A5?= =?UTF-8?q?=EA=B3=BC=20=EB=B9=84=EC=9A=A9=20=EB=AA=A8=EB=8D=B8=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/styles/main.css | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/renderer/styles/main.css b/src/renderer/styles/main.css index 14dd204f..32ed177f 100644 --- a/src/renderer/styles/main.css +++ b/src/renderer/styles/main.css @@ -17,20 +17,20 @@ body.dmn-custom-cursor * { /* ===== 글래스 백드롭 ===== */ /* 글래스 백드롭 — 블러에 밝기·채도 클램프를 결합. - 블러 반경은 매 프레임 면적×반경 비례로 재필터되는 비용 다이얼 — - 어두운 틴트 아래서 큰 반경은 체감 차이 없이 비용만 늘어 16px 상한 유지. - 글래스 체감은 반경이 아니라 틴트 알파·클램프 완화·채도 부스트가 만든다 */ + 비용 지배 요인은 반경이 아니라 표면 수·면적·아래 damage(재필터 트리거) — + Skia가 큰 반경을 저해상도 다운샘플로 처리해 반경 비용은 평탄화됨. + 글래스는 일시 표면(모달·팝업) 전용 유지, 표면 자체에 transform 애니메이션 금지 */ .backdrop-glass { - -webkit-backdrop-filter: blur(16px) brightness(var(--ui-glass-backdrop-dim)) + -webkit-backdrop-filter: blur(32px) brightness(var(--ui-glass-backdrop-dim)) saturate(var(--ui-glass-backdrop-sat)); - backdrop-filter: blur(16px) brightness(var(--ui-glass-backdrop-dim)) + backdrop-filter: blur(32px) brightness(var(--ui-glass-backdrop-dim)) saturate(var(--ui-glass-backdrop-sat)); } .backdrop-glass-popup { - -webkit-backdrop-filter: blur(12px) brightness(var(--ui-glass-backdrop-dim)) + -webkit-backdrop-filter: blur(24px) brightness(var(--ui-glass-backdrop-dim)) saturate(var(--ui-glass-backdrop-sat)); - backdrop-filter: blur(12px) brightness(var(--ui-glass-backdrop-dim)) + backdrop-filter: blur(24px) brightness(var(--ui-glass-backdrop-dim)) saturate(var(--ui-glass-backdrop-sat)); } From f0a4a1a9ec590a44d8fe43e0100deeff09101973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=97=B0=EC=9A=B0?= Date: Thu, 16 Jul 2026 00:39:48 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20=EC=8A=A4=ED=81=AC=EB=A6=BC=C2=B7?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EB=93=9C=20=ED=8C=A8=EB=84=90=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=20=EB=B8=94=EB=9F=AC=20=EB=B3=B5=EC=9B=90?= =?UTF-8?q?=EA=B3=BC=20=EA=B8=80=EB=9E=98=EC=8A=A4=20=ED=88=AC=EA=B3=BC=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EC=96=BC=20=EC=99=84=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/Grid/PropertiesPanel/panelChrome.ts | 7 ++++--- src/renderer/components/main/Modal/Modal.tsx | 7 ++++--- src/renderer/styles/main.css | 17 +++++++++++++++++ src/renderer/styles/tokens.css | 10 ++++++---- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/main/Grid/PropertiesPanel/panelChrome.ts b/src/renderer/components/main/Grid/PropertiesPanel/panelChrome.ts index 568d8108..5f267ab3 100644 --- a/src/renderer/components/main/Grid/PropertiesPanel/panelChrome.ts +++ b/src/renderer/components/main/Grid/PropertiesPanel/panelChrome.ts @@ -1,8 +1,9 @@ // 사이드 패널 공통 크롬 — 재질/레이아웃 변경은 여기 한 곳에서 -// 프레임이 재질을 소유하고, 페이지 전환 시 콘텐츠 레이어만 슬라이드 -// 상주 풀하이트 표면이라 라이브 블러 금지 — 고알파 솔리드 + 인셋 링으로 근사 +// 프레임이 글래스 재질을 소유하고, 페이지 전환 시 콘텐츠 레이어만 슬라이드 +// 상주 풀하이트 표면의 라이브 블러 — 캔버스 damage마다 재필터되므로 +// Windows에서 키 연타 프레임 실측이 유지 조건 (미달 시 bg-glass-panel-solid로 복귀) export const SIDE_PANEL_FRAME_CLASS = - 'absolute right-0 top-0 bottom-0 w-[240px] bg-glass-panel-solid shadow-elevation-panel z-30'; + 'absolute right-0 top-0 bottom-0 w-[240px] bg-glass-panel backdrop-glass-popup shadow-elevation-panel z-30'; // 구상 패널 루트 — 프레임을 꽉 채우는 투명 레이어 export const PANEL_ROOT_CLASS = 'absolute inset-0 flex flex-col'; diff --git a/src/renderer/components/main/Modal/Modal.tsx b/src/renderer/components/main/Modal/Modal.tsx index fcb298c1..0d46c4c2 100644 --- a/src/renderer/components/main/Modal/Modal.tsx +++ b/src/renderer/components/main/Modal/Modal.tsx @@ -158,7 +158,7 @@ const Modal = ({ // backdrop root가 되어 페이드 동안 블러가 죽었다가 끝나는 순간 튐. // 그래서 animate-modal-scale은 래퍼가 아닌 직계 자식(> *)에 적용되고, // 등장 모션은 스크림(틴트 키프레임)과 콘텐츠 루트가 각자 소유한다 - // 스크림은 알파 딤만 — backdrop 블러는 풀스크린 재필터라 금지 (Windows 렉) + // 스크림은 검은 딤 + 은은한 상수 블러 — 블러 키프레임 보간만 금지 (Windows 렉 요인) return createPortal(
{/* 스크림 언더레이 — 클릭은 래퍼로 통과. 전면 시트는 스크림 생략 — 시트가 영역을 다 덮어 어둡히기가 무의미하고, - 스크림이 겹치면 같은 글래스 토큰인데 사이드 패널보다 어둡게 합성됨 */} + 스크림이 겹치면 같은 글래스 토큰인데 사이드 패널보다 어둡게 합성됨 + 스크림 알파는 카드 글래스 투과와 곱으로 결합 — --ui-glass-heavy와 함께 조절 */} {!fullSurface && (