wing-ops/frontend/src/pages/design/components/ButtonCatalogSection.tsx
leedano d0491c3f0f feat(design): Stitch MCP 기반 디자인 시스템 카탈로그 + SCAT 하드코딩 해안선 제거
- react-router-dom 도입, /design 경로에 디자인 토큰/컴포넌트 카탈로그 페이지 추가
- SCAT 지도에서 하드코딩된 제주 해안선 좌표 제거, 인접 구간 기반 동적 방향 계산으로 전환
- @/ path alias 추가, SVG 아이콘 에셋 추가
2026-03-24 16:36:50 +09:00

243 lines
11 KiB
TypeScript

import pdfFileIcon from '../../../assets/icons/wing-pdf-file.svg';
import pdfFileDisabledIcon from '../../../assets/icons/wing-pdf-file-disabled.svg';
interface ButtonRow {
label: string;
defaultBtn: React.ReactNode;
hoverBtn: React.ReactNode;
disabledBtn: React.ReactNode;
}
const buttonRows: ButtonRow[] = [
{
label: '프라이머리 (그라디언트)',
defaultBtn: (
<div
className='rounded-md pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'
style={{
background: 'linear-gradient(120.41deg, rgba(6, 182, 212, 1) 0%, rgba(59, 130, 246, 1) 100%)',
}}
>
<div className='text-white text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
hoverBtn: (
<div
className='rounded-md pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'
style={{
background: 'linear-gradient(120.41deg, rgba(6, 182, 212, 1) 0%, rgba(59, 130, 246, 1) 100%)',
boxShadow: '0px 0px 12px 0px rgba(6, 182, 212, 0.4)',
}}
>
<div className='text-white text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
disabledBtn: (
<div
className='bg-[#334155] rounded-md pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'
style={{ opacity: 0.5 }}
>
<div className='text-[#64748b] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
},
{
label: '세컨더리 (솔리드)',
defaultBtn: (
<div className='bg-[#1a2236] rounded-md border border-solid border-[#1e2a42] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'>
<div className='text-[#b0b8cc] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
hoverBtn: (
<div className='bg-[#1e2844] rounded-md border border-solid border-[#1e2a42] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'>
<div className='text-[#b0b8cc] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
disabledBtn: (
<div className='bg-[rgba(26,34,54,0.50)] rounded-md border border-solid border-[rgba(30,42,66,0.30)] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'>
<div className='text-[rgba(176,184,204,0.30)] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
},
{
label: '아웃라인 (고스트)',
defaultBtn: (
<div className='rounded-md border border-solid border-[#1e2a42] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'>
<div className='text-[#b0b8cc] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
hoverBtn: (
<div className='bg-[#1e2844] rounded-md border border-solid border-[#1e2a42] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'>
<div className='text-[#b0b8cc] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
disabledBtn: (
<div className='rounded-md border border-solid border-[rgba(30,42,66,0.30)] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'>
<div className='text-[rgba(176,184,204,0.30)] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
},
{
label: 'PDF 액션',
defaultBtn: (
<div className='bg-[rgba(59,130,246,0.08)] rounded-md border border-solid border-[rgba(59,130,246,0.30)] pt-1.5 pr-3 pb-1.5 pl-3 flex flex-row gap-2 items-center justify-start shrink-0 relative'>
<img
className='shrink-0 relative overflow-visible'
src={pdfFileIcon}
alt='PDF 아이콘'
/>
<div className='text-[#3b82f6] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
PDF
</div>
</div>
),
hoverBtn: (
<div
className='bg-[rgba(59,130,246,0.15)] rounded-md border border-solid border-[rgba(59,130,246,0.50)] pt-1.5 pr-3 pb-1.5 pl-3 flex flex-row gap-2 items-center justify-start shrink-0 relative'
style={{ boxShadow: '0px 0px 8px 0px rgba(59, 130, 246, 0.2)' }}
>
<img
className='shrink-0 relative overflow-visible'
src={pdfFileIcon}
alt='PDF 아이콘'
/>
<div className='text-[#3b82f6] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
PDF
</div>
</div>
),
disabledBtn: (
<div className='bg-[rgba(59,130,246,0.04)] rounded-md border border-solid border-[rgba(59,130,246,0.10)] pt-1.5 pr-3 pb-1.5 pl-3 flex flex-row gap-2 items-center justify-start shrink-0 relative'>
<img
className='shrink-0 relative overflow-visible'
src={pdfFileDisabledIcon}
alt='PDF 아이콘 (비활성)'
/>
<div className='text-[rgba(59,130,246,0.40)] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
PDF
</div>
</div>
),
},
{
label: '경고 (삭제)',
defaultBtn: (
<div className='bg-[rgba(239,68,68,0.10)] rounded-md border border-solid border-[rgba(239,68,68,0.30)] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'>
<div className='text-[#ef4444] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
hoverBtn: (
<div
className='bg-[rgba(239,68,68,0.20)] rounded-md border border-solid border-[rgba(239,68,68,0.50)] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'
style={{ boxShadow: '0px 0px 8px 0px rgba(239, 68, 68, 0.15)' }}
>
<div className='text-[#ef4444] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
disabledBtn: (
<div className='bg-[rgba(239,68,68,0.05)] rounded-md border border-solid border-[rgba(239,68,68,0.15)] pt-1.5 pr-3 pb-[7px] pl-3 flex flex-row gap-0 items-center justify-center shrink-0 relative'>
<div className='text-[rgba(239,68,68,0.40)] text-center font-korean text-[11px] font-medium relative flex items-center justify-center'>
</div>
</div>
),
},
];
export const ButtonCatalogSection = () => {
return (
<div className='bg-[#1a2236] rounded-[10px] border border-solid border-[#1e2a42] flex flex-col gap-0 items-start justify-start overflow-hidden w-full'>
{/* 카드 헤더 */}
<div className='border-b border-solid border-[#1e2a42] pt-4 pr-6 pb-4 pl-6 flex flex-row gap-3 items-center justify-start self-stretch shrink-0 relative'>
<div className='bg-[#06b6d4] rounded-xl shrink-0 w-1 h-4 relative' />
<div
className='text-[#22d3ee] text-left font-korean text-xs leading-4 font-medium uppercase relative flex items-center justify-start'
style={{ letterSpacing: '1.2px' }}
>
인터페이스: 버튼
</div>
</div>
{/* 테이블 본문 */}
<div className='p-6 flex flex-col gap-0 items-start justify-start self-stretch shrink-0 relative overflow-hidden'>
<div className='flex flex-col items-start justify-start self-stretch shrink-0 relative'>
{/* 헤더 행 */}
<div className='border-b border-solid border-[#1e2a42] flex flex-row gap-0 items-start justify-center self-stretch shrink-0 relative'>
{['버튼 유형', '기본 상태', '호버 상태', '비활성 상태'].map((header) => (
<div
key={header}
className='pt-px pr-2 pb-[17.5px] pl-2 flex flex-col gap-0 items-start justify-start flex-1 min-w-0 relative'
>
<div
className='text-[#64748b] text-left font-korean text-xs font-medium uppercase relative flex items-center justify-start'
style={{ letterSpacing: '-0.55px' }}
>
{header}
</div>
</div>
))}
</div>
{/* 데이터 행 */}
<div
className='flex flex-col items-start justify-start self-stretch shrink-0 relative'
style={{ margin: '-1px 0 0 0' }}
>
{buttonRows.map((row, index) => (
<div
key={row.label}
className='border-t border-solid border-[rgba(30,42,66,0.50)] flex flex-row gap-0 items-start justify-center self-stretch shrink-0 relative'
style={index === 0 ? { borderTopColor: 'transparent' } : { margin: '-1px 0 0 0' }}
>
{/* 버튼 유형 레이블 */}
<div className='pt-[31.5px] pr-2 pb-[31.5px] pl-2 flex flex-col gap-0 items-start justify-start flex-1 min-w-0 relative'>
<div className='text-[#bcc9cd] text-left font-korean text-xs font-medium relative flex items-center justify-start'>
{row.label}
</div>
</div>
{/* 기본 상태 */}
<div className='pt-[24.5px] pr-2 pb-[24.5px] pl-2 flex flex-col gap-0 items-start justify-start flex-1 min-w-0 relative'>
{row.defaultBtn}
</div>
{/* 호버 상태 */}
<div className='pt-[24.5px] pr-2 pb-[24.5px] pl-2 flex flex-col gap-0 items-start justify-start flex-1 min-w-0 relative'>
{row.hoverBtn}
</div>
{/* 비활성 상태 */}
<div className='pt-[24.5px] pr-2 pb-[24.5px] pl-2 flex flex-col gap-0 items-start justify-start flex-1 min-w-0 relative'>
{row.disabledBtn}
</div>
</div>
))}
</div>
</div>
</div>
</div>
);
};