import {useState} from 'react'; import { AlertTriangle, Check, ClipboardCopy, Image as ImageIcon, Info, FileText, Loader2, MessageCircleQuestion, Pencil, Plus, Shapes, Sparkles, Trash2, Wand2, X, } from 'lucide-react'; import type {InfoField} from '@o2o/shared'; import {Badge} from '@/components/ui/badge'; import {Button} from '@/components/ui/button'; import {Input} from '@/components/ui/input'; import {PasteFactsPanel, RecollectPanel} from '@/features/onboarding'; import {cn} from '@/lib/utils'; import {useBuilderStore, useUnverifiedFields, type RightTab} from '@/stores/builder'; import {INDUSTRY_CONFIGS} from '@/data/industryData'; import {FaqPanel} from './FaqPanel'; import {SectionDesignPanel} from './SectionDesignPanel'; import {resolveVariant} from './canvas/registry'; import { buildPrompt, dataSpecFor, parseSectionData, SECTION_DATA_MAX_CHARS, } from './canvas/dataSpec'; const TABS: {id: RightTab; label: string; icon: typeof Info}[] = [ {id: 'content', label: '콘텐츠', icon: FileText}, {id: 'design', label: '디자인', icon: Shapes}, {id: 'photos', label: '사진', icon: ImageIcon}, {id: 'info', label: '정보', icon: Info}, {id: 'faq', label: 'FAQ', icon: MessageCircleQuestion}, {id: 'verify', label: '확인', icon: AlertTriangle}, ]; export function RightTabsPanel() { const activeTab = useBuilderStore((s) => s.rightTab); const setRightTab = useBuilderStore((s) => s.setRightTab); const unverified = useUnverifiedFields(); return (
{TABS.map(({id, label, icon: Icon}) => ( ))}
{activeTab === 'design' && } {activeTab === 'content' && } {activeTab === 'photos' && } {activeTab === 'info' && } {activeTab === 'faq' && } {activeTab === 'verify' && }
); } function ContentTab() { const industry = useBuilderStore((s) => s.industry); const sections = useBuilderStore((s) => s.sections); const selectedSectionId = useBuilderStore((s) => s.selectedSectionId); const updateSectionContent = useBuilderStore((s) => s.updateSectionContent); const storeName = useBuilderStore((s) => s.storeName); const setStoreName = useBuilderStore((s) => s.setStoreName); const section = sections.find((item) => item.id === selectedSectionId); if (!section) { return (

편집할 섹션을 선택하세요

왼쪽 섹션 목록이나 미리보기에서 선택할 수 있습니다.

); } const update = (patch: {name?: string; description?: string; body?: string}) => updateSectionContent(section.id, { name: patch.name ?? section.name, description: patch.description ?? section.description, body: patch.body ?? section.body, }); const variantId = resolveVariant(section, industry)?.id ?? ''; const supportsTitle = section.type !== 'local'; const supportsDescription = !( variantId.startsWith('rooms.') || variantId.startsWith('rules.') || variantId.startsWith('local.') || variantId === 'menu.price-table' || variantId === 'space.list' || variantId === 'programs.table' || variantId === 'exhibition.notice' ); const supportsBody = variantId.startsWith('intro.') || variantId.startsWith('booking.') || variantId === 'inquiry.cta' || variantId === 'exhibition.notice'; return (

{section.name} 콘텐츠

입력 즉시 미리보기에 반영됩니다.

{supportsTitle && section.type === 'hero' ? ( ) : supportsTitle ? ( ) : null} {supportsDescription && } {supportsBody &&