diff --git a/frontend/src/components/Icons.tsx b/frontend/src/components/Icons.tsx
index 8d95ee0..a727c2d 100644
--- a/frontend/src/components/Icons.tsx
+++ b/frontend/src/components/Icons.tsx
@@ -97,3 +97,11 @@ export const IconSpider = (p: IcoProps) =>
export const IconTag = (p: IcoProps) =>
+
+/* ── 입찰 모니터 / 공통 UI ── */
+export const IconGovt = (p: IcoProps) =>
+export const IconX = (p: IcoProps) =>
+export const IconCheck = (p: IcoProps) =>
+export const IconTrash = (p: IcoProps) =>
+export const IconPaperclip = (p: IcoProps) =>
+export const IconPause = (p: IcoProps) =>
diff --git a/frontend/src/pages/BidWatcher.tsx b/frontend/src/pages/BidWatcher.tsx
index 6e3bc33..3d6f475 100644
--- a/frontend/src/pages/BidWatcher.tsx
+++ b/frontend/src/pages/BidWatcher.tsx
@@ -1,5 +1,6 @@
import { useState, useEffect, useCallback } from 'react'
import axios from 'axios'
+import { IconGovt, IconRefresh, IconX, IconCheck, IconTrash, IconPaperclip, IconPause } from '../components/Icons'
const API = import.meta.env.VITE_ITSM_API ?? 'http://localhost:9001'
@@ -224,13 +225,15 @@ export default function BidWatcher() {
return (
-
📋 나라장터 입찰 모니터
+
+ 나라장터 입찰 모니터
+
당일 SW개발용역·유지보수·시스템구축·고도화(SI/SM) 입찰정보 자동 수집
{stats && <> · {stats.network_mode === 'open' ? '개방망 연동' : '폐쇄망 샘플 모드'}>}
-
@@ -412,7 +415,7 @@ export default function BidWatcher() {
{docs.map(d => (
- 📎 {d.name}
+ {d.name}
{d.doc_type}
handleDownloadDoc(selected, d)} style={btnSm('#6366f1')}>다운로드
@@ -430,9 +433,9 @@ export default function BidWatcher() {
- {selected.status !== 'JOIN' && handleStatusChange(selected, 'JOIN')} style={{ ...btnPrimary, background: '#16a34a' }}>✅ 참가}
- {selected.status !== 'HOLD' && handleStatusChange(selected, 'HOLD')} style={{ ...btnPrimary, background: '#f59e0b' }}>⏸ 보류}
- {selected.status !== 'DELETED' && handleStatusChange(selected, 'DELETED')} style={{ ...btnPrimary, background: '#dc2626' }}>🗑 삭제}
+ {selected.status !== 'JOIN' && handleStatusChange(selected, 'JOIN')} style={{ ...btnPrimary, background: '#16a34a', display: 'inline-flex', alignItems: 'center', gap: 6 }}> 참가}
+ {selected.status !== 'HOLD' && handleStatusChange(selected, 'HOLD')} style={{ ...btnPrimary, background: '#f59e0b', display: 'inline-flex', alignItems: 'center', gap: 6 }}> 보류}
+ {selected.status !== 'DELETED' && handleStatusChange(selected, 'DELETED')} style={{ ...btnPrimary, background: '#dc2626', display: 'inline-flex', alignItems: 'center', gap: 6 }}> 삭제}
{selected.status !== 'NEW' && handleStatusChange(selected, 'NEW')} style={{ ...btnPrimary, background: '#64748b' }}>↩ 신규로}