위젯 추가팝업 수정

This commit is contained in:
Macbook
2026-06-15 16:00:41 +09:00
parent e655725ce8
commit 4d7ad65cd1
5 changed files with 73 additions and 6 deletions
@@ -24,6 +24,8 @@ interface Props {
onUpdateGridFr: (rowFr: number[], colFr: number[]) => void;
/** Tauri OS 창 — 네이티브 타이틀·리사이즈 사용, 내부 플로팅 크롬 숨김 */
nativeShell?: boolean;
/** 위젯 선택 팝업 열림/닫힘 (네이티브 창 크기 조절용) */
onPickerOpenChange?: (open: boolean) => void;
}
const FloatingWidgetWindow: React.FC<Props> = ({
@@ -35,8 +37,19 @@ const FloatingWidgetWindow: React.FC<Props> = ({
onUpdateSize,
onUpdateGridFr,
nativeShell = false,
onPickerOpenChange,
}) => {
const [pickSlotId, setPickSlotId] = useState<string | null>(null);
const openPicker = useCallback((slotId: string) => {
setPickSlotId(slotId);
onPickerOpenChange?.(true);
}, [onPickerOpenChange]);
const closePicker = useCallback(() => {
setPickSlotId(null);
onPickerOpenChange?.(false);
}, [onPickerOpenChange]);
const bodyWrapRef = useRef<HTMLDivElement>(null);
const bodyRef = useRef<HTMLDivElement>(null);
const [bodySize, setBodySize] = useState({ width: 0, height: 0 });
@@ -130,8 +143,8 @@ const FloatingWidgetWindow: React.FC<Props> = ({
const applyWidgetType = useCallback((widgetType: string) => {
if (!pickSlotId) return;
updateSlot(pickSlotId, s => ({ ...s, widgetType, config: {} }));
setPickSlotId(null);
}, [pickSlotId, updateSlot]);
closePicker();
}, [pickSlotId, updateSlot, closePicker]);
const clearWidget = useCallback((slotId: string) => {
updateSlot(slotId, s => ({ ...s, widgetType: null, config: {} }));
@@ -233,7 +246,7 @@ const FloatingWidgetWindow: React.FC<Props> = ({
<WidgetSlotView
slot={slot}
zoneId="center"
onPickWidget={id => setPickSlotId(id)}
onPickWidget={openPicker}
onClearWidget={id => clearWidget(id)}
/>
</div>
@@ -291,7 +304,8 @@ const FloatingWidgetWindow: React.FC<Props> = ({
<WidgetPickerModal
open={pickSlotId != null}
category="all"
onClose={() => setPickSlotId(null)}
nativeCompact={nativeShell}
onClose={closePicker}
onSelect={applyWidgetType}
/>
</>
@@ -10,6 +10,8 @@ interface Props {
category: WidgetPickerCategory;
onClose: () => void;
onSelect: (widgetType: string) => void;
/** Tauri 네이티브 위젯 창 — 작은 viewport에 맞춘 전체 화면형 팝업 */
nativeCompact?: boolean;
}
const WidgetPickerModal: React.FC<Props> = ({
@@ -17,6 +19,7 @@ const WidgetPickerModal: React.FC<Props> = ({
category,
onClose,
onSelect,
nativeCompact = false,
}) => {
if (!open) return null;
@@ -37,11 +40,12 @@ const WidgetPickerModal: React.FC<Props> = ({
onClose={onClose}
title={title}
titleKo="Widget"
width={620}
width={720}
maxWidth="96vw"
backdrop
closeOnBackdrop
zIndex={13200}
shellClassName={nativeCompact ? 'app-popup-shell--widget-picker-native' : 'app-popup-shell--widget-picker'}
bodyClassName="wd-picker-popup-body"
>
<p className="wd-layout-intro">{intro}</p>