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}척
+
+
{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] }))} />