d3ro-voice/packages/ui/src/components/ds/StatRing.tsx
Yun Chan b820c789bb refactor(ui): 팝업 테마 SSOT 정합 + DS 데드코드 3종 제거 (WS1)
- theme-vars.ts dark/light POPUP_THEME_VARS를 theme.ts RAW와 값 정합:
  v1 잔존 주황(#f25b29) -> 파랑(dark #3b82f6 / light #2563eb),
  --d3-bg-card, --d3-text-dimLabel 동기화. 팝업=렌더러 색상 충돌 해소.
- DS 미사용 3종 제거: MetalDial, ButtonGroup, CrtDisplay + barrel export
  (렌더러 전체 import 0건 재검증)
- StatRing RING_COLORS hex 10종 -> d3roPalette.gradient.wave/tag 토큰
  (다크 고정 -> 테마 전환 대응)
SKIP: theme-vars 평행 SSOT 구조 단일화, theme.ts amber 별칭 제거
  (web/admin/site가 accent.amber 사용 -> 전체 치환 별도 wave)
정책: docs/REFACTOR_POLICY.md DP1, DP9
2026-07-22 01:53:59 +09:00

66 lines
2.2 KiB
TypeScript

'use client'
// src/renderer/components/ds/StatRing.tsx
// v2 신규: 컬러 그라디언트 링 아이콘 — 스탯 타일의 원형 링 (레퍼런스 4타일 패턴)
import { Box } from '@mui/material'
import { d3roPalette } from '../../theme'
type RingColor = 'blue' | 'purple' | 'green' | 'orange' | 'red' | 'accent'
const RING_COLORS: Record<RingColor, { from: string; to: string; glow: string; icon: string }> = {
blue: { from: 'var(--d3-gradient-wave1)', to: 'var(--d3-gradient-wave2)', glow: d3roPalette.tag.blueBg, icon: d3roPalette.tag.blue },
purple: { from: 'var(--d3-gradient-wave3)', to: 'var(--d3-gradient-wave4)', glow: d3roPalette.tag.purpleBg, icon: d3roPalette.tag.purple },
green: { from: d3roPalette.tag.green, to: d3roPalette.tag.green, glow: d3roPalette.tag.greenGlow, icon: d3roPalette.tag.green },
orange: { from: d3roPalette.tag.orange, to: d3roPalette.tag.orange, glow: d3roPalette.tag.orangeGlow, icon: d3roPalette.tag.orange },
red: { from: d3roPalette.tag.red, to: d3roPalette.tag.red, glow: d3roPalette.tag.redGlow, icon: d3roPalette.tag.red },
accent: { from: 'var(--d3-accent-light)', to: 'var(--d3-accent-dark)', glow: 'var(--d3-accent-dim)', icon: d3roPalette.accent.light },
}
interface StatRingProps {
/** 링 색 (기본 blue) */
color?: RingColor
/** 외경 px (기본 56) */
size?: number
/** 링 두께 px (기본 2) */
thickness?: number
/** 중앙 아이콘/콘텐츠 */
children?: React.ReactNode
}
export function StatRing({
color = 'blue',
size = 56,
thickness = 2,
children,
}: StatRingProps): React.ReactElement {
const c = RING_COLORS[color]
return (
<Box
sx={{
width: size,
height: size,
borderRadius: '50%',
p: `${thickness}px`,
background: `conic-gradient(from 210deg, ${c.from}, ${c.to}, ${c.from})`,
boxShadow: `0 0 ${size / 3.5}px ${c.glow}`,
flexShrink: 0,
}}
>
<Box
sx={{
width: '100%',
height: '100%',
borderRadius: '50%',
bgcolor: d3roPalette.bg.crtGlass,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
color: c.icon,
}}
>
{children}
</Box>
</Box>
)
}