From 2adcbc9a93e55ed8dfdf915365a203bd490443f8 Mon Sep 17 00:00:00 2001 From: htlee Date: Tue, 17 Feb 2026 06:18:57 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20toggles=20CSS=EB=A5=BC=20Tailwind?= =?UTF-8?q?=20+=20@wing/ui=EB=A1=9C=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- apps/web/src/app/styles.css | 3 +- .../web/src/app/styles/components/toggles.css | 75 ------------------- .../map3dSettings/Map3DSettingsToggles.tsx | 7 +- .../features/mapSettings/MapSettingsPanel.tsx | 7 +- .../src/features/mapToggles/MapToggles.tsx | 13 +++- .../features/typeFilter/TypeFilterGrid.tsx | 22 +++--- .../src/pages/dashboard/DashboardSidebar.tsx | 22 +++--- 7 files changed, 41 insertions(+), 108 deletions(-) delete mode 100644 apps/web/src/app/styles/components/toggles.css diff --git a/apps/web/src/app/styles.css b/apps/web/src/app/styles.css index 66105fa..063b98e 100644 --- a/apps/web/src/app/styles.css +++ b/apps/web/src/app/styles.css @@ -6,9 +6,8 @@ @import "./styles/base.css"; -/* Components (layout.css, topbar.css → inline Tailwind) */ +/* Components (layout/topbar/toggles → inline Tailwind + @wing/ui) */ @import "./styles/components/panels.css"; -@import "./styles/components/toggles.css"; @import "./styles/components/speed.css"; @import "./styles/components/vessel-list.css"; @import "./styles/components/ais-list.css"; diff --git a/apps/web/src/app/styles/components/toggles.css b/apps/web/src/app/styles/components/toggles.css deleted file mode 100644 index 328818c..0000000 --- a/apps/web/src/app/styles/components/toggles.css +++ /dev/null @@ -1,75 +0,0 @@ -/* Type grid */ -.tg { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 3px; -} - -.tb { - background: var(--card); - border: 1px solid transparent; - border-radius: 5px; - padding: 4px; - cursor: pointer; - text-align: center; - transition: all 0.15s; - user-select: none; -} - -.tb:hover { - border-color: var(--border); -} - -.tb.on { - border-color: var(--accent); - background: rgba(59, 130, 246, 0.1); -} - -.tb .c { - font-size: 11px; - font-weight: 800; -} - -.tb .n { - font-size: 8px; - color: var(--muted); -} - -/* Toggles */ -.tog { - display: flex; - gap: 3px; - flex-wrap: wrap; - margin-bottom: 6px; -} - -.tog.tog-map { - /* Keep "지도 표시 설정" buttons in a predictable 2-row layout (4 columns). */ - gap: 4px; -} - -.tog.tog-map .tog-btn { - flex: 1 1 calc(25% - 4px); - text-align: center; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.tog-btn { - font-size: 8px; - padding: 2px 6px; - border-radius: 3px; - border: 1px solid var(--border); - background: var(--card); - color: var(--muted); - cursor: pointer; - transition: all 0.15s; - user-select: none; -} - -.tog-btn.on { - background: var(--accent); - color: #fff; - border-color: var(--accent); -} diff --git a/apps/web/src/features/map3dSettings/Map3DSettingsToggles.tsx b/apps/web/src/features/map3dSettings/Map3DSettingsToggles.tsx index 6c8b0cc..d657f58 100644 --- a/apps/web/src/features/map3dSettings/Map3DSettingsToggles.tsx +++ b/apps/web/src/features/map3dSettings/Map3DSettingsToggles.tsx @@ -1,3 +1,4 @@ +import { ToggleButton } from '@wing/ui'; import type { Map3DSettings } from "../../widgets/map3d/Map3D"; type Props = { @@ -13,11 +14,11 @@ export function Map3DSettingsToggles({ value, onToggle }: Props) { ]; return ( -
+
{items.map((t) => ( -
onToggle(t.id)}> + onToggle(t.id)}> {t.label} -
+ ))}
); diff --git a/apps/web/src/features/mapSettings/MapSettingsPanel.tsx b/apps/web/src/features/mapSettings/MapSettingsPanel.tsx index 592fb60..95dcb0c 100644 --- a/apps/web/src/features/mapSettings/MapSettingsPanel.tsx +++ b/apps/web/src/features/mapSettings/MapSettingsPanel.tsx @@ -146,8 +146,7 @@ export function MapSettingsPanel({ value, onChange }: MapSettingsPanelProps) {
수심 구간 색상 @@ -176,11 +175,11 @@ export function MapSettingsPanel({ value, onChange }: MapSettingsPanelProps) { {/* ── Depth font size ───────────────────────────── */}
수심 폰트 크기
-
+
{FONT_SIZES.map((fs) => (
update('depthFontSize', fs.value)} > {fs.label} diff --git a/apps/web/src/features/mapToggles/MapToggles.tsx b/apps/web/src/features/mapToggles/MapToggles.tsx index cb4e550..1ee204b 100644 --- a/apps/web/src/features/mapToggles/MapToggles.tsx +++ b/apps/web/src/features/mapToggles/MapToggles.tsx @@ -1,3 +1,5 @@ +import { ToggleButton } from '@wing/ui'; + export type MapToggleState = { pairLines: boolean; pairRange: boolean; @@ -27,11 +29,16 @@ export function MapToggles({ value, onToggle }: Props) { ]; return ( -
+
{items.map((t) => ( -
onToggle(t.id)}> + onToggle(t.id)} + className="flex-[1_1_calc(25%-4px)] overflow-hidden text-center text-ellipsis whitespace-nowrap" + > {t.label} -
+ ))}
); diff --git a/apps/web/src/features/typeFilter/TypeFilterGrid.tsx b/apps/web/src/features/typeFilter/TypeFilterGrid.tsx index 085acbe..d947e09 100644 --- a/apps/web/src/features/typeFilter/TypeFilterGrid.tsx +++ b/apps/web/src/features/typeFilter/TypeFilterGrid.tsx @@ -9,26 +9,26 @@ type Props = { onToggleAll: () => void; }; +const TB = "cursor-pointer rounded-[5px] border p-1 text-center transition-all duration-150 select-none"; +const TB_ON = "border-wing-accent bg-wing-accent/10"; +const TB_OFF = "border-transparent bg-wing-card hover:border-wing-border"; + export function TypeFilterGrid({ enabled, totalCount, countsByType, onToggle, onToggleAll }: Props) { const allOn = VESSEL_TYPE_ORDER.every((c) => enabled[c]); return ( -
-
-
- 전체 -
-
{totalCount}척
+
+
+
전체
+
{totalCount}척
{VESSEL_TYPE_ORDER.map((code) => { const t = VESSEL_TYPES[code]; const cnt = countsByType[code] ?? 0; return ( -
onToggle(code)}> -
- {code} -
-
{cnt}척
+
onToggle(code)}> +
{code}
+
{cnt}척
); })} diff --git a/apps/web/src/pages/dashboard/DashboardSidebar.tsx b/apps/web/src/pages/dashboard/DashboardSidebar.tsx index d6527f6..cc6991f 100644 --- a/apps/web/src/pages/dashboard/DashboardSidebar.tsx +++ b/apps/web/src/pages/dashboard/DashboardSidebar.tsx @@ -1,3 +1,4 @@ +import { ToggleButton } from '@wing/ui'; import type { AisTarget } from '../../entities/aisTarget/model/types'; import type { LegacyVesselIndex } from '../../entities/legacyVessel/lib'; import type { LegacyVesselDataset, LegacyVesselInfo } from '../../entities/legacyVessel/model/types'; @@ -97,9 +98,9 @@ export function DashboardSidebar({
업종 필터
-
-
+ { setShowTargets((v) => { const next = !v; @@ -110,10 +111,10 @@ export function DashboardSidebar({ title="레거시(CN permit) 대상 선박 표시" > 대상 선박 -
-
setShowOthers((v) => !v)} title="대상 외 AIS 선박 표시"> + + setShowOthers((v) => !v)} title="대상 외 AIS 선박 표시"> 기타 AIS -
+
지도 표시 설정
-
setProjection((p) => (p === 'globe' ? 'mercator' : 'globe'))} title={isProjectionToggleDisabled ? '3D 모드 준비 중...' : '3D 지구본 투영: 드래그로 회전, 휠로 확대/축소'} - style={{ fontSize: 9, padding: '2px 8px', opacity: isProjectionToggleDisabled ? 0.4 : 1, cursor: isProjectionToggleDisabled ? 'not-allowed' : 'pointer' }} + className="px-2 py-0.5 text-[9px]" + style={{ opacity: isProjectionToggleDisabled ? 0.4 : 1, cursor: isProjectionToggleDisabled ? 'not-allowed' : 'pointer' }} > 3D -
+
setOverlays((prev) => ({ ...prev, [k]: !prev[k] }))} />