앱 위젯추가 팝업 수정

This commit is contained in:
Macbook
2026-06-15 16:30:44 +09:00
parent 1eaecbb586
commit 63a40c9c75
4 changed files with 223 additions and 50 deletions
@@ -10,20 +10,11 @@ interface Props {
category: WidgetPickerCategory;
onClose: () => void;
onSelect: (widgetType: string) => void;
/** Tauri 네이티브 위젯 창 — 작은 viewport에 맞춘 전체 화면형 팝업 */
/** Tauri 네이티브 위젯 창 — OS 창 전체를 쓰는 고정형 picker */
nativeCompact?: boolean;
}
const WidgetPickerModal: React.FC<Props> = ({
open,
category,
onClose,
onSelect,
nativeCompact = false,
}) => {
if (!open) return null;
const groups = category === 'all' ? widgetsByGroupAll() : widgetsByGroup(category);
function pickerMeta(category: WidgetPickerCategory) {
const title = category === 'center'
? '메인 위젯'
: category === 'side'
@@ -34,20 +25,19 @@ const WidgetPickerModal: React.FC<Props> = ({
: category === 'side'
? '좌·우·하단 패널에 추가할 위젯을 선택하세요. 주식 HTS/위젯 프로그램에서 흔히 쓰는 구성을 지원합니다.'
: '추가할 위젯 유형을 선택하세요. 차트·시세·매매·포트폴리오 등 모든 위젯을 사용할 수 있습니다.';
return { title, intro };
}
const WidgetPickerContent: React.FC<{
category: WidgetPickerCategory;
onSelect: (widgetType: string) => void;
onClose: () => void;
}> = ({ category, onSelect, onClose }) => {
const groups = category === 'all' ? widgetsByGroupAll() : widgetsByGroup(category);
const { intro } = pickerMeta(category);
return (
<AppPopup
onClose={onClose}
title={title}
titleKo="Widget"
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>
{groups.map(g => (
<section key={g.group} className="wd-picker-section">
@@ -70,6 +60,85 @@ const WidgetPickerModal: React.FC<Props> = ({
</div>
</section>
))}
</>
);
};
const NativeWidgetPicker: React.FC<Props> = ({
open,
category,
onClose,
onSelect,
}) => {
if (!open) return null;
const { title } = pickerMeta(category);
return (
<div className="wd-picker-native-overlay" role="presentation">
<div
className="wd-picker-native-shell"
role="dialog"
aria-modal="true"
aria-labelledby="wd-picker-native-title"
>
<div className="wd-picker-native-header">
<h2 id="wd-picker-native-title" className="wd-picker-native-title">
{title}
<span className="wd-picker-native-title-ko"> (Widget)</span>
</h2>
<button
type="button"
className="wd-picker-native-close"
onClick={onClose}
aria-label="닫기"
>
</button>
</div>
<div className="wd-picker-native-body wd-picker-popup-body">
<WidgetPickerContent category={category} onSelect={onSelect} onClose={onClose} />
</div>
</div>
</div>
);
};
const WidgetPickerModal: React.FC<Props> = ({
open,
category,
onClose,
onSelect,
nativeCompact = false,
}) => {
if (!open) return null;
if (nativeCompact) {
return (
<NativeWidgetPicker
open={open}
category={category}
onClose={onClose}
onSelect={onSelect}
/>
);
}
const { title } = pickerMeta(category);
return (
<AppPopup
onClose={onClose}
title={title}
titleKo="Widget"
width={720}
maxWidth="96vw"
backdrop
closeOnBackdrop
zIndex={13200}
shellClassName="app-popup-shell--widget-picker"
bodyClassName="wd-picker-popup-body"
>
<WidgetPickerContent category={category} onSelect={onSelect} onClose={onClose} />
</AppPopup>
);
};