From a041f1b6a975259ba956e98625da00925cd004f8 Mon Sep 17 00:00:00 2001 From: yunchan8804 Date: Wed, 8 Apr 2026 14:50:33 +0900 Subject: [PATCH] =?UTF-8?q?feat(V2-1c):=20packages/ui=20=EC=B6=94=EC=B6=9C?= =?UTF-8?q?=20=E2=80=94=20DS=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20+=20?= =?UTF-8?q?theme=20+=20theme-vars=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit packages/ui (@d3ro/ui) 신규: - src/theme.ts (d3roPalette/d3roTypo/d3roShadow/d3roRadius SSOT) - src/theme-vars.ts (팝업/main 프로세스용 CSS 변수 맵) - src/components/ds/ (CrtDisplay, InstrumentPanel, Led, MetalCard, MetalDial, PhosphorText, PhysicalButton, ScreenPanel, ButtonGroup) - src/index.ts barrel - subpath exports: ./theme, ./theme-vars, ./components/ds - React/MUI/Emotion은 peerDependencies로 선언 - @d3ro/core만 직접 의존성 apps/desktop/src/shared/ 디렉토리 완전 제거: - theme-vars가 마지막 남은 파일이었음 - tsconfig include에서 src/shared/**/* 제거 일괄 치환 (renderer 전역): - ../theme, ../../theme, ./theme → @d3ro/ui/theme - ../components/ds, ../../components/ds, ./ds, ../ds → @d3ro/ui/components/ds - ../ds/, ../../ds/ → @d3ro/ui/components/ds (세부 파일 import는 barrel로 통합) - @shared/theme-vars → @d3ro/ui/theme-vars (WindowManager) apps/desktop 설정: - package.json: @d3ro/ui: '*' dep 추가 - tsconfig.node/web.json: @shared/* paths 완전 제거, @d3ro/ui, @d3ro/ui/* paths 추가 - electron.vite.config.ts: @shared alias 제거, @d3ro/ui alias 추가, externalize exclude에 @d3ro/ui 추가 - vitest.config.ts: alias 교체 DS 컴포넌트 내부의 '../../theme' 상대 경로는 packages/ui 구조에서 동일하게 해결되어 그대로 유효. 검증: typecheck + build + dev 런타임 모두 통과. --- apps/desktop/electron.vite.config.ts | 12 ++++-- apps/desktop/package.json | 1 + .../desktop/src/main/windows/WindowManager.ts | 2 +- apps/desktop/src/renderer/App.tsx | 2 +- .../src/renderer/components/AppLayout.tsx | 4 +- .../src/renderer/components/FileDropZone.tsx | 4 +- .../renderer/components/HotkeyRecordModal.tsx | 2 +- .../src/renderer/components/LicenseModal.tsx | 4 +- .../src/renderer/components/LicenseTab.tsx | 2 +- .../renderer/components/OllamaGuideModal.tsx | 4 +- .../renderer/components/OnboardingModal.tsx | 4 +- .../src/renderer/components/ProBadge.tsx | 2 +- .../src/renderer/components/SettingsModal.tsx | 2 +- .../src/renderer/components/StatusBar.tsx | 4 +- .../renderer/components/TemplateSection.tsx | 4 +- .../components/UpgradePromptModal.tsx | 2 +- .../components/meeting/AddDocumentDialog.tsx | 8 ++-- .../components/meeting/DocumentTab.tsx | 4 +- .../components/meeting/EditableSegment.tsx | 2 +- .../components/meeting/ExportMenu.tsx | 4 +- .../components/meeting/MarkdownEditor.tsx | 4 +- .../components/meeting/MarkdownRenderer.tsx | 2 +- .../components/meeting/MeetingChatPanel.tsx | 6 +-- .../components/meeting/MeetingDetailTabs.tsx | 4 +- .../components/meeting/TranscriptTab.tsx | 6 +-- .../components/shared/EmptyStateCard.tsx | 2 +- .../components/shared/HistoryEntryCard.tsx | 4 +- .../renderer/components/shared/PageHeader.tsx | 4 +- .../components/shared/SearchInput.tsx | 2 +- .../src/renderer/pages/CommandsPage.tsx | 4 +- .../src/renderer/pages/DashboardPage.tsx | 4 +- .../src/renderer/pages/DictionaryPage.tsx | 4 +- .../src/renderer/pages/HistoryPage.tsx | 4 +- .../src/renderer/pages/KnowledgeBasePage.tsx | 4 +- .../src/renderer/pages/MeetingModePage.tsx | 4 +- .../renderer/pages/VoiceConversationPage.tsx | 4 +- apps/desktop/tsconfig.node.json | 6 +-- apps/desktop/tsconfig.web.json | 8 ++-- apps/desktop/vitest.config.ts | 4 +- memory/project_status.md | 30 ++++++++++++- package-lock.json | 25 +++++++++++ packages/ui/package.json | 42 +++++++++++++++++++ .../ui/src}/components/ds/ButtonGroup.tsx | 0 .../ui/src}/components/ds/CrtDisplay.tsx | 0 .../ui/src}/components/ds/InstrumentPanel.tsx | 0 .../ui/src}/components/ds/Led.tsx | 0 .../ui/src}/components/ds/MetalCard.tsx | 0 .../ui/src}/components/ds/MetalDial.tsx | 0 .../ui/src}/components/ds/PhosphorText.tsx | 0 .../ui/src}/components/ds/PhysicalButton.tsx | 0 .../ui/src}/components/ds/ScreenPanel.tsx | 0 .../ui/src}/components/ds/index.ts | 0 packages/ui/src/index.ts | 8 ++++ .../shared => packages/ui/src}/theme-vars.ts | 0 .../src/renderer => packages/ui/src}/theme.ts | 0 packages/ui/tsconfig.json | 9 ++++ 56 files changed, 191 insertions(+), 76 deletions(-) create mode 100644 packages/ui/package.json rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/ButtonGroup.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/CrtDisplay.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/InstrumentPanel.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/Led.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/MetalCard.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/MetalDial.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/PhosphorText.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/PhysicalButton.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/ScreenPanel.tsx (100%) rename {apps/desktop/src/renderer => packages/ui/src}/components/ds/index.ts (100%) create mode 100644 packages/ui/src/index.ts rename {apps/desktop/src/shared => packages/ui/src}/theme-vars.ts (100%) rename {apps/desktop/src/renderer => packages/ui/src}/theme.ts (100%) create mode 100644 packages/ui/tsconfig.json diff --git a/apps/desktop/electron.vite.config.ts b/apps/desktop/electron.vite.config.ts index 0f47991..89969bd 100644 --- a/apps/desktop/electron.vite.config.ts +++ b/apps/desktop/electron.vite.config.ts @@ -3,19 +3,23 @@ import { defineConfig, externalizeDepsPlugin } from 'electron-vite' import react from '@vitejs/plugin-react' const sharedAlias = { - '@shared': resolve(__dirname, 'src/shared'), - '@d3ro/core': resolve(__dirname, '../../packages/core/src') + '@d3ro/core': resolve(__dirname, '../../packages/core/src'), + '@d3ro/ui': resolve(__dirname, '../../packages/ui/src') } +const workspaceExclude = ['@d3ro/core', '@d3ro/ui'] + export default defineConfig({ main: { plugins: [ - externalizeDepsPlugin({ exclude: ['nanoid', 'electron-store', '@d3ro/core'] }) + externalizeDepsPlugin({ + exclude: ['nanoid', 'electron-store', ...workspaceExclude] + }) ], resolve: { alias: sharedAlias } }, preload: { - plugins: [externalizeDepsPlugin({ exclude: ['@d3ro/core'] })], + plugins: [externalizeDepsPlugin({ exclude: workspaceExclude })], build: { rollupOptions: { input: { diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 59b9324..e1113a1 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -41,6 +41,7 @@ }, "dependencies": { "@d3ro/core": "*", + "@d3ro/ui": "*", "@electron-toolkit/preload": "^3.0.2", "@electron-toolkit/utils": "^4.0.0", "@emotion/react": "^11.14.0", diff --git a/apps/desktop/src/main/windows/WindowManager.ts b/apps/desktop/src/main/windows/WindowManager.ts index d15560f..6dbde74 100644 --- a/apps/desktop/src/main/windows/WindowManager.ts +++ b/apps/desktop/src/main/windows/WindowManager.ts @@ -8,7 +8,7 @@ import { WINDOW_SIZE } from '@d3ro/core/constants' import { getLogger } from '../services/LoggerService' import { getIsQuitting } from '../lifecycle' import { configGet } from '../services/ConfigService' -import { buildPopupThemeCss } from '@shared/theme-vars' +import { buildPopupThemeCss } from '@d3ro/ui/theme-vars' const logger = getLogger('WindowManager') diff --git a/apps/desktop/src/renderer/App.tsx b/apps/desktop/src/renderer/App.tsx index 64397bf..339dbdf 100644 --- a/apps/desktop/src/renderer/App.tsx +++ b/apps/desktop/src/renderer/App.tsx @@ -4,7 +4,7 @@ import { useState, useEffect, useMemo, useRef } from 'react' import { ThemeProvider, CssBaseline, useMediaQuery } from '@mui/material' -import { getTheme } from './theme' +import { getTheme } from '@d3ro/ui/theme' import { I18nProvider } from './i18n' import { AppLayout } from './components/AppLayout' import { UpgradePromptModal } from './components/UpgradePromptModal' diff --git a/apps/desktop/src/renderer/components/AppLayout.tsx b/apps/desktop/src/renderer/components/AppLayout.tsx index 1fb9893..13ce02f 100644 --- a/apps/desktop/src/renderer/components/AppLayout.tsx +++ b/apps/desktop/src/renderer/components/AppLayout.tsx @@ -11,7 +11,7 @@ import RecordVoiceOverIcon from '@mui/icons-material/RecordVoiceOver' import AutoStoriesIcon from '@mui/icons-material/AutoStories' import GroupsIcon from '@mui/icons-material/Groups' import SettingsIcon from '@mui/icons-material/Settings' -import { Led } from './ds' +import { Led } from '@d3ro/ui/components/ds' import { DashboardPage } from '../pages/DashboardPage' import { HistoryPage } from '../pages/HistoryPage' import { DictionaryPage } from '../pages/DictionaryPage' @@ -23,7 +23,7 @@ import { SettingsModal } from './SettingsModal' import { LicenseModal } from './LicenseModal' import { OnboardingModal } from './OnboardingModal' import { StatusBar } from './StatusBar' -import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { TranslationKey } from '../i18n' import type { LicenseTier } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/FileDropZone.tsx b/apps/desktop/src/renderer/components/FileDropZone.tsx index 6f86a87..2f2ed7c 100644 --- a/apps/desktop/src/renderer/components/FileDropZone.tsx +++ b/apps/desktop/src/renderer/components/FileDropZone.tsx @@ -6,8 +6,8 @@ import { Box, LinearProgress, IconButton, Tooltip } from '@mui/material' import ContentCopyIcon from '@mui/icons-material/ContentCopy' import CloseIcon from '@mui/icons-material/Close' import UploadFileIcon from '@mui/icons-material/UploadFile' -import { MetalCard, PhosphorText, Led } from './ds' -import { d3roPalette, d3roTypo } from '../theme' +import { MetalCard, PhosphorText, Led } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { FileTranscriptionProgress, diff --git a/apps/desktop/src/renderer/components/HotkeyRecordModal.tsx b/apps/desktop/src/renderer/components/HotkeyRecordModal.tsx index f0f0dda..690f036 100644 --- a/apps/desktop/src/renderer/components/HotkeyRecordModal.tsx +++ b/apps/desktop/src/renderer/components/HotkeyRecordModal.tsx @@ -15,7 +15,7 @@ import { Stack, Typography, } from '@mui/material' -import { d3roPalette } from '../theme' +import { d3roPalette } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { HotkeyBinding } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/LicenseModal.tsx b/apps/desktop/src/renderer/components/LicenseModal.tsx index d1b68d4..773596a 100644 --- a/apps/desktop/src/renderer/components/LicenseModal.tsx +++ b/apps/desktop/src/renderer/components/LicenseModal.tsx @@ -21,8 +21,8 @@ import { import CloseIcon from '@mui/icons-material/Close' import CheckCircleIcon from '@mui/icons-material/CheckCircle' import CancelIcon from '@mui/icons-material/Cancel' -import { MetalCard, PhosphorText, Led, ScreenPanel, PhysicalButton } from './ds' -import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '../theme' +import { MetalCard, PhosphorText, Led, ScreenPanel, PhysicalButton } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { LicenseInfo, LicenseTier, TierComparison, UsageQuota } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/LicenseTab.tsx b/apps/desktop/src/renderer/components/LicenseTab.tsx index b3da07a..8b9d06b 100644 --- a/apps/desktop/src/renderer/components/LicenseTab.tsx +++ b/apps/desktop/src/renderer/components/LicenseTab.tsx @@ -12,7 +12,7 @@ import { } from '@mui/material' import CheckCircleIcon from '@mui/icons-material/CheckCircle' import CancelIcon from '@mui/icons-material/Cancel' -import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { LicenseInfo, diff --git a/apps/desktop/src/renderer/components/OllamaGuideModal.tsx b/apps/desktop/src/renderer/components/OllamaGuideModal.tsx index 4a626ae..e3b6b74 100644 --- a/apps/desktop/src/renderer/components/OllamaGuideModal.tsx +++ b/apps/desktop/src/renderer/components/OllamaGuideModal.tsx @@ -15,8 +15,8 @@ import { import CloseIcon from '@mui/icons-material/Close' import OpenInNewIcon from '@mui/icons-material/OpenInNew' import ContentCopyIcon from '@mui/icons-material/ContentCopy' -import { d3roPalette, d3roFontMono, d3roShadow } from '../theme' -import { Led } from './ds' +import { d3roPalette, d3roFontMono, d3roShadow } from '@d3ro/ui/theme' +import { Led } from '@d3ro/ui/components/ds' import { useI18n } from '../i18n' interface OllamaGuideModalProps { diff --git a/apps/desktop/src/renderer/components/OnboardingModal.tsx b/apps/desktop/src/renderer/components/OnboardingModal.tsx index c68a452..ead7090 100644 --- a/apps/desktop/src/renderer/components/OnboardingModal.tsx +++ b/apps/desktop/src/renderer/components/OnboardingModal.tsx @@ -15,8 +15,8 @@ import MicIcon from '@mui/icons-material/Mic' import KeyboardIcon from '@mui/icons-material/Keyboard' import CheckCircleIcon from '@mui/icons-material/CheckCircle' import OpenInNewIcon from '@mui/icons-material/OpenInNew' -import { d3roPalette, d3roFontMono, d3roShadow } from '../theme' -import { Led } from './ds' +import { d3roPalette, d3roFontMono, d3roShadow } from '@d3ro/ui/theme' +import { Led } from '@d3ro/ui/components/ds' import { HotkeyRecordModal } from './HotkeyRecordModal' import { useI18n } from '../i18n' import type { HotkeyBinding, AudioDevice } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/ProBadge.tsx b/apps/desktop/src/renderer/components/ProBadge.tsx index e8c6dea..91c4d7a 100644 --- a/apps/desktop/src/renderer/components/ProBadge.tsx +++ b/apps/desktop/src/renderer/components/ProBadge.tsx @@ -4,7 +4,7 @@ import { Box, Typography } from '@mui/material' import LockIcon from '@mui/icons-material/Lock' -import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme' import { useProFeature } from '../hooks/useProFeature' import { useI18n } from '../i18n' import type { Feature } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/SettingsModal.tsx b/apps/desktop/src/renderer/components/SettingsModal.tsx index ca31706..75bb321 100644 --- a/apps/desktop/src/renderer/components/SettingsModal.tsx +++ b/apps/desktop/src/renderer/components/SettingsModal.tsx @@ -31,7 +31,7 @@ import MicIcon from '@mui/icons-material/Mic' import LockIcon from '@mui/icons-material/Lock' import CheckCircleIcon from '@mui/icons-material/CheckCircle' import CancelIcon from '@mui/icons-material/Cancel' -import { d3roPalette, d3roFontMono, d3roShadow } from '../theme' +import { d3roPalette, d3roFontMono, d3roShadow } from '@d3ro/ui/theme' import { HotkeyRecordModal } from './HotkeyRecordModal' import { LicenseTab } from './LicenseTab' import { useI18n, LOCALE_META } from '../i18n' diff --git a/apps/desktop/src/renderer/components/StatusBar.tsx b/apps/desktop/src/renderer/components/StatusBar.tsx index ecf746b..8b6e99b 100644 --- a/apps/desktop/src/renderer/components/StatusBar.tsx +++ b/apps/desktop/src/renderer/components/StatusBar.tsx @@ -5,8 +5,8 @@ import { useState, useEffect } from 'react' import { Box, Typography, Fade, IconButton } from '@mui/material' import CloseIcon from '@mui/icons-material/Close' -import { Led } from './ds' -import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '../theme' +import { Led } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '@d3ro/ui/theme' import { OllamaGuideModal } from './OllamaGuideModal' import { useI18n } from '../i18n' import type { LLMStatus } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/TemplateSection.tsx b/apps/desktop/src/renderer/components/TemplateSection.tsx index dcbfcde..bf07789 100644 --- a/apps/desktop/src/renderer/components/TemplateSection.tsx +++ b/apps/desktop/src/renderer/components/TemplateSection.tsx @@ -7,9 +7,9 @@ import AddIcon from '@mui/icons-material/Add' import DeleteIcon from '@mui/icons-material/Delete' import EditIcon from '@mui/icons-material/Edit' import PlayArrowIcon from '@mui/icons-material/PlayArrow' -import { MetalCard, PhosphorText, Led, PhysicalButton } from './ds' +import { MetalCard, PhosphorText, Led, PhysicalButton } from '@d3ro/ui/components/ds' import { PageHeader, EmptyStateCard } from './shared' -import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { DictationTemplate, TemplateField, TemplateSessionInfo } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/UpgradePromptModal.tsx b/apps/desktop/src/renderer/components/UpgradePromptModal.tsx index a2a31d3..b53975b 100644 --- a/apps/desktop/src/renderer/components/UpgradePromptModal.tsx +++ b/apps/desktop/src/renderer/components/UpgradePromptModal.tsx @@ -14,7 +14,7 @@ import { } from '@mui/material' import LockIcon from '@mui/icons-material/Lock' import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline' -import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { UpgradePromptEvent, UsageQuota } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/meeting/AddDocumentDialog.tsx b/apps/desktop/src/renderer/components/meeting/AddDocumentDialog.tsx index 8113cc5..80b0824 100644 --- a/apps/desktop/src/renderer/components/meeting/AddDocumentDialog.tsx +++ b/apps/desktop/src/renderer/components/meeting/AddDocumentDialog.tsx @@ -11,10 +11,10 @@ import { TextField, LinearProgress, } from '@mui/material' -import { MetalCard } from '../ds/MetalCard' -import { PhosphorText } from '../ds/PhosphorText' -import { PhysicalButton } from '../ds/PhysicalButton' -import { d3roPalette, d3roTypo, d3roRadius, d3roShadow } from '../../theme' +import { MetalCard } from '@d3ro/ui/components/ds' +import { PhosphorText } from '@d3ro/ui/components/ds' +import { PhysicalButton } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' interface TemplateItem { diff --git a/apps/desktop/src/renderer/components/meeting/DocumentTab.tsx b/apps/desktop/src/renderer/components/meeting/DocumentTab.tsx index b8f9dde..51e1732 100644 --- a/apps/desktop/src/renderer/components/meeting/DocumentTab.tsx +++ b/apps/desktop/src/renderer/components/meeting/DocumentTab.tsx @@ -6,8 +6,8 @@ import { Box } from '@mui/material' import DeleteIcon from '@mui/icons-material/Delete' import { MarkdownEditor } from './MarkdownEditor' import { ExportMenu } from './ExportMenu' -import { PhysicalButton } from '../ds/PhysicalButton' -import { d3roPalette, d3roTypo } from '../../theme' +import { PhysicalButton } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' import type { MeetingExportFormat } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/meeting/EditableSegment.tsx b/apps/desktop/src/renderer/components/meeting/EditableSegment.tsx index a8e1618..7a92483 100644 --- a/apps/desktop/src/renderer/components/meeting/EditableSegment.tsx +++ b/apps/desktop/src/renderer/components/meeting/EditableSegment.tsx @@ -3,7 +3,7 @@ import { useState, useRef, useCallback } from 'react' import { Box, TextField, Tooltip, Chip } from '@mui/material' -import { d3roPalette, d3roFontMono } from '../../theme' +import { d3roPalette, d3roFontMono } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' // Phase 15.5: 화자별 색상 매핑 (d3roPalette SSOT) diff --git a/apps/desktop/src/renderer/components/meeting/ExportMenu.tsx b/apps/desktop/src/renderer/components/meeting/ExportMenu.tsx index 717d534..db5a243 100644 --- a/apps/desktop/src/renderer/components/meeting/ExportMenu.tsx +++ b/apps/desktop/src/renderer/components/meeting/ExportMenu.tsx @@ -4,8 +4,8 @@ import { useState, useCallback } from 'react' import { Menu, MenuItem } from '@mui/material' import FileDownloadIcon from '@mui/icons-material/FileDownload' -import { PhysicalButton } from '../ds/PhysicalButton' -import { d3roPalette, d3roTypo, d3roFontMono, d3roRadius, d3roShadow } from '../../theme' +import { PhysicalButton } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roTypo, d3roFontMono, d3roRadius, d3roShadow } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' import type { MeetingExportFormat } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/meeting/MarkdownEditor.tsx b/apps/desktop/src/renderer/components/meeting/MarkdownEditor.tsx index 7f4e61b..bcdce8b 100644 --- a/apps/desktop/src/renderer/components/meeting/MarkdownEditor.tsx +++ b/apps/desktop/src/renderer/components/meeting/MarkdownEditor.tsx @@ -4,8 +4,8 @@ import { useState } from 'react' import { Box } from '@mui/material' import { MarkdownRenderer } from './MarkdownRenderer' -import { PhysicalButton } from '../ds/PhysicalButton' -import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '../../theme' +import { PhysicalButton } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' interface MarkdownEditorProps { diff --git a/apps/desktop/src/renderer/components/meeting/MarkdownRenderer.tsx b/apps/desktop/src/renderer/components/meeting/MarkdownRenderer.tsx index 29159c1..1a2ce4d 100644 --- a/apps/desktop/src/renderer/components/meeting/MarkdownRenderer.tsx +++ b/apps/desktop/src/renderer/components/meeting/MarkdownRenderer.tsx @@ -4,7 +4,7 @@ import ReactMarkdown from 'react-markdown' import remarkGfm from 'remark-gfm' import { Box } from '@mui/material' -import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '../../theme' +import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme' import type { Components } from 'react-markdown' interface MarkdownRendererProps { diff --git a/apps/desktop/src/renderer/components/meeting/MeetingChatPanel.tsx b/apps/desktop/src/renderer/components/meeting/MeetingChatPanel.tsx index a173e37..0df913c 100644 --- a/apps/desktop/src/renderer/components/meeting/MeetingChatPanel.tsx +++ b/apps/desktop/src/renderer/components/meeting/MeetingChatPanel.tsx @@ -7,9 +7,9 @@ import SendIcon from '@mui/icons-material/Send' import DeleteSweepIcon from '@mui/icons-material/DeleteSweep' import ExpandLessIcon from '@mui/icons-material/ExpandLess' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' -import { PhosphorText } from '../ds/PhosphorText' -import { PhysicalButton } from '../ds/PhysicalButton' -import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow } from '../../theme' +import { PhosphorText } from '@d3ro/ui/components/ds' +import { PhysicalButton } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' import type { MeetingChatMessage } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/meeting/MeetingDetailTabs.tsx b/apps/desktop/src/renderer/components/meeting/MeetingDetailTabs.tsx index fe36eac..2a99bc0 100644 --- a/apps/desktop/src/renderer/components/meeting/MeetingDetailTabs.tsx +++ b/apps/desktop/src/renderer/components/meeting/MeetingDetailTabs.tsx @@ -18,8 +18,8 @@ import { TranscriptTab } from './TranscriptTab' import { DocumentTab } from './DocumentTab' import { AddDocumentDialog } from './AddDocumentDialog' import { MeetingChatPanel } from './MeetingChatPanel' -import { PhosphorText } from '../ds/PhosphorText' -import { d3roPalette, d3roFontMono, d3roTypo } from '../../theme' +import { PhosphorText } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' import type { MeetingSessionDetail, diff --git a/apps/desktop/src/renderer/components/meeting/TranscriptTab.tsx b/apps/desktop/src/renderer/components/meeting/TranscriptTab.tsx index 08fad30..5a8798e 100644 --- a/apps/desktop/src/renderer/components/meeting/TranscriptTab.tsx +++ b/apps/desktop/src/renderer/components/meeting/TranscriptTab.tsx @@ -4,9 +4,9 @@ import { useState, useCallback } from 'react' import { Box, Switch, FormControlLabel, LinearProgress, Snackbar, Alert } from '@mui/material' import { EditableSegment } from './EditableSegment' -import { PhysicalButton } from '../ds/PhysicalButton' -import { PhosphorText } from '../ds/PhosphorText' -import { d3roPalette, d3roFontMono, d3roTypo } from '../../theme' +import { PhysicalButton } from '@d3ro/ui/components/ds' +import { PhosphorText } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' import FileDownloadIcon from '@mui/icons-material/FileDownload' import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh' diff --git a/apps/desktop/src/renderer/components/shared/EmptyStateCard.tsx b/apps/desktop/src/renderer/components/shared/EmptyStateCard.tsx index 9c19afc..48a7206 100644 --- a/apps/desktop/src/renderer/components/shared/EmptyStateCard.tsx +++ b/apps/desktop/src/renderer/components/shared/EmptyStateCard.tsx @@ -2,7 +2,7 @@ // 공유: 데이터 없음 상태 카드 import { Box } from '@mui/material' -import { MetalCard, PhosphorText } from '../ds' +import { MetalCard, PhosphorText } from '@d3ro/ui/components/ds' interface EmptyStateCardProps { message: string diff --git a/apps/desktop/src/renderer/components/shared/HistoryEntryCard.tsx b/apps/desktop/src/renderer/components/shared/HistoryEntryCard.tsx index 1cdfbe6..1991823 100644 --- a/apps/desktop/src/renderer/components/shared/HistoryEntryCard.tsx +++ b/apps/desktop/src/renderer/components/shared/HistoryEntryCard.tsx @@ -10,8 +10,8 @@ import LocalOfferIcon from '@mui/icons-material/LocalOffer' import CloseIcon from '@mui/icons-material/Close' import SummarizeIcon from '@mui/icons-material/Summarize' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' -import { MetalCard, Led } from '../ds' -import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '../../theme' +import { MetalCard, Led } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme' import { useI18n } from '../../i18n' import { formatDuration } from '../../utils/formatters' import type { HistoryEntry, MemoTag, MeetingSummaryResult } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/components/shared/PageHeader.tsx b/apps/desktop/src/renderer/components/shared/PageHeader.tsx index f421c23..83362ef 100644 --- a/apps/desktop/src/renderer/components/shared/PageHeader.tsx +++ b/apps/desktop/src/renderer/components/shared/PageHeader.tsx @@ -2,8 +2,8 @@ // 공유: 각인 스타일 페이지 헤더 (타이틀 + 카운트 + 옵션 액션) import { Box } from '@mui/material' -import { PhosphorText } from '../ds' -import { d3roPalette } from '../../theme' +import { PhosphorText } from '@d3ro/ui/components/ds' +import { d3roPalette } from '@d3ro/ui/theme' interface PageHeaderProps { title: string diff --git a/apps/desktop/src/renderer/components/shared/SearchInput.tsx b/apps/desktop/src/renderer/components/shared/SearchInput.tsx index 31218d7..462860a 100644 --- a/apps/desktop/src/renderer/components/shared/SearchInput.tsx +++ b/apps/desktop/src/renderer/components/shared/SearchInput.tsx @@ -3,7 +3,7 @@ import { TextField, InputAdornment } from '@mui/material' import SearchIcon from '@mui/icons-material/Search' -import { d3roPalette, d3roFontMono, d3roTypo } from '../../theme' +import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme' interface SearchInputProps { value: string diff --git a/apps/desktop/src/renderer/pages/CommandsPage.tsx b/apps/desktop/src/renderer/pages/CommandsPage.tsx index 47d8fa2..f68ebfb 100644 --- a/apps/desktop/src/renderer/pages/CommandsPage.tsx +++ b/apps/desktop/src/renderer/pages/CommandsPage.tsx @@ -10,9 +10,9 @@ import EditIcon from '@mui/icons-material/Edit' import CheckCircleIcon from '@mui/icons-material/CheckCircle' import PlayArrowIcon from '@mui/icons-material/PlayArrow' import LinkIcon from '@mui/icons-material/Link' -import { MetalCard, PhosphorText, Led, ScreenPanel } from '../components/ds' +import { MetalCard, PhosphorText, Led, ScreenPanel } from '@d3ro/ui/components/ds' import { PageHeader, EmptyStateCard } from '../components/shared' -import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import { TemplateSection } from '../components/TemplateSection' import type { VoiceCommandRule, VoiceCommandKeyword, KeywordMatchMode, LLMChain, ChainStep } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/pages/DashboardPage.tsx b/apps/desktop/src/renderer/pages/DashboardPage.tsx index 959c406..8400db1 100644 --- a/apps/desktop/src/renderer/pages/DashboardPage.tsx +++ b/apps/desktop/src/renderer/pages/DashboardPage.tsx @@ -4,9 +4,9 @@ import { useState, useEffect, useCallback, useMemo, useRef } from 'react' import { Box } from '@mui/material' -import { CrtDisplay, InstrumentPanel, Led, MetalCard, PhosphorText, ScreenPanel, ButtonGroup, PhysicalButton } from '../components/ds' +import { CrtDisplay, InstrumentPanel, Led, MetalCard, PhosphorText, ScreenPanel, ButtonGroup, PhysicalButton } from '@d3ro/ui/components/ds' import { EmptyStateCard, HistoryEntryCard } from '../components/shared' -import { d3roPalette, d3roTypo } from '../theme' +import { d3roPalette, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import { formatRecordingTime, formatRecordingTimeUnit, formatNumber, getDateKey } from '../utils/formatters' import { FileDropZone } from '../components/FileDropZone' diff --git a/apps/desktop/src/renderer/pages/DictionaryPage.tsx b/apps/desktop/src/renderer/pages/DictionaryPage.tsx index 98c938e..c8a1847 100644 --- a/apps/desktop/src/renderer/pages/DictionaryPage.tsx +++ b/apps/desktop/src/renderer/pages/DictionaryPage.tsx @@ -6,9 +6,9 @@ import { Box, TextField, Button, IconButton, Dialog, DialogTitle, DialogContent, import AddIcon from '@mui/icons-material/Add' import DeleteIcon from '@mui/icons-material/Delete' import EditIcon from '@mui/icons-material/Edit' -import { MetalCard, PhosphorText } from '../components/ds' +import { MetalCard, PhosphorText } from '@d3ro/ui/components/ds' import { PageHeader, SearchInput, EmptyStateCard } from '../components/shared' -import { d3roPalette, d3roFontMono, d3roTypo } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { DictionaryEntry, DictionaryPage as DictPageData } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/pages/HistoryPage.tsx b/apps/desktop/src/renderer/pages/HistoryPage.tsx index 477169e..c11dd3b 100644 --- a/apps/desktop/src/renderer/pages/HistoryPage.tsx +++ b/apps/desktop/src/renderer/pages/HistoryPage.tsx @@ -5,8 +5,8 @@ import { useState, useEffect, useCallback, useMemo } from 'react' import { Box, Chip, IconButton, Tooltip } from '@mui/material' import FileDownloadIcon from '@mui/icons-material/FileDownload' -import { PhosphorText } from '../components/ds' -import { d3roPalette, d3roTypo, d3roFontMono, d3roRadius } from '../theme' +import { PhosphorText } from '@d3ro/ui/components/ds' +import { d3roPalette, d3roTypo, d3roFontMono, d3roRadius } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import { getDateKey } from '../utils/formatters' import { EmptyStateCard, SearchInput, PageHeader, HistoryEntryCard } from '../components/shared' diff --git a/apps/desktop/src/renderer/pages/KnowledgeBasePage.tsx b/apps/desktop/src/renderer/pages/KnowledgeBasePage.tsx index 444ba57..f125b85 100644 --- a/apps/desktop/src/renderer/pages/KnowledgeBasePage.tsx +++ b/apps/desktop/src/renderer/pages/KnowledgeBasePage.tsx @@ -10,9 +10,9 @@ import RefreshIcon from '@mui/icons-material/Refresh' import SearchIcon from '@mui/icons-material/Search' import SendIcon from '@mui/icons-material/Send' import DescriptionIcon from '@mui/icons-material/Description' -import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel } from '../components/ds' +import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel } from '@d3ro/ui/components/ds' import { PageHeader, EmptyStateCard } from '../components/shared' -import { d3roPalette, d3roFontMono, d3roTypo } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { RAGDocument, RAGQueryResult, RAGIndexProgress } from '@d3ro/core/types' diff --git a/apps/desktop/src/renderer/pages/MeetingModePage.tsx b/apps/desktop/src/renderer/pages/MeetingModePage.tsx index 586c7b7..672cbaa 100644 --- a/apps/desktop/src/renderer/pages/MeetingModePage.tsx +++ b/apps/desktop/src/renderer/pages/MeetingModePage.tsx @@ -12,11 +12,11 @@ import { import AddIcon from '@mui/icons-material/Add' import StopIcon from '@mui/icons-material/Stop' import FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord' -import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel } from '../components/ds' +import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel } from '@d3ro/ui/components/ds' import { MeetingDetailTabs } from '../components/meeting/MeetingDetailTabs' import { EditableSegment } from '../components/meeting/EditableSegment' import { PageHeader, EmptyStateCard } from '../components/shared' -import { d3roPalette, d3roFontMono, d3roTypo } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { MeetingSessionSummary, diff --git a/apps/desktop/src/renderer/pages/VoiceConversationPage.tsx b/apps/desktop/src/renderer/pages/VoiceConversationPage.tsx index 4765992..483787b 100644 --- a/apps/desktop/src/renderer/pages/VoiceConversationPage.tsx +++ b/apps/desktop/src/renderer/pages/VoiceConversationPage.tsx @@ -9,9 +9,9 @@ import StopIcon from '@mui/icons-material/Stop' import SendIcon from '@mui/icons-material/Send' import DeleteSweepIcon from '@mui/icons-material/DeleteSweep' import CancelIcon from '@mui/icons-material/Cancel' -import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel, InstrumentPanel } from '../components/ds' +import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel, InstrumentPanel } from '@d3ro/ui/components/ds' import { PageHeader } from '../components/shared' -import { d3roPalette, d3roFontMono, d3roTypo } from '../theme' +import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme' import { useI18n } from '../i18n' import type { ConversationState, diff --git a/apps/desktop/tsconfig.node.json b/apps/desktop/tsconfig.node.json index 5e7ba84..649f4f7 100644 --- a/apps/desktop/tsconfig.node.json +++ b/apps/desktop/tsconfig.node.json @@ -5,9 +5,10 @@ "outDir": "./out", "baseUrl": ".", "paths": { - "@shared/*": ["src/shared/*"], "@d3ro/core": ["../../packages/core/src/index.ts"], - "@d3ro/core/*": ["../../packages/core/src/*"] + "@d3ro/core/*": ["../../packages/core/src/*"], + "@d3ro/ui": ["../../packages/ui/src/index.ts"], + "@d3ro/ui/*": ["../../packages/ui/src/*"] }, "strict": true, "noImplicitAny": true, @@ -21,7 +22,6 @@ "include": [ "src/main/**/*", "src/preload/**/*", - "src/shared/**/*", "electron.vite.config.ts" ] } diff --git a/apps/desktop/tsconfig.web.json b/apps/desktop/tsconfig.web.json index faf1d56..e6f5ac8 100644 --- a/apps/desktop/tsconfig.web.json +++ b/apps/desktop/tsconfig.web.json @@ -5,9 +5,10 @@ "outDir": "./out", "baseUrl": ".", "paths": { - "@shared/*": ["src/shared/*"], "@d3ro/core": ["../../packages/core/src/index.ts"], - "@d3ro/core/*": ["../../packages/core/src/*"] + "@d3ro/core/*": ["../../packages/core/src/*"], + "@d3ro/ui": ["../../packages/ui/src/index.ts"], + "@d3ro/ui/*": ["../../packages/ui/src/*"] }, "jsx": "react-jsx", "strict": true, @@ -20,7 +21,6 @@ "skipLibCheck": true }, "include": [ - "src/renderer/**/*", - "src/shared/**/*" + "src/renderer/**/*" ] } diff --git a/apps/desktop/vitest.config.ts b/apps/desktop/vitest.config.ts index d1b8aa6..685360b 100644 --- a/apps/desktop/vitest.config.ts +++ b/apps/desktop/vitest.config.ts @@ -17,8 +17,8 @@ export default defineConfig({ }, resolve: { alias: { - '@shared': resolve(__dirname, 'src/shared'), - '@d3ro/core': resolve(__dirname, '../../packages/core/src') + '@d3ro/core': resolve(__dirname, '../../packages/core/src'), + '@d3ro/ui': resolve(__dirname, '../../packages/ui/src') } } }) diff --git a/memory/project_status.md b/memory/project_status.md index 51262d6..df17256 100644 --- a/memory/project_status.md +++ b/memory/project_status.md @@ -8,7 +8,8 @@ **V1 (Electron) 완료** → **V2 (Monorepo) 진행 중** - Phase V2-1a ✅ 완료 (Monorepo 구조 이동) - Phase V2-1b ✅ 완료 (packages/core 추출) -- 다음: Phase V2-1c (packages/ui 추출) — 별도 세션 +- Phase V2-1c ✅ 완료 (packages/ui 추출) +- 다음: Phase V2-1d (packages/i18n 추출) ## V1 완료 페이즈 @@ -38,9 +39,34 @@ |---|---|---| | V2-1a | npm workspaces + apps/desktop으로 V1 이동 | ✅ 완료 | | V2-1b | packages/core 추출 (types, errors, ipc-channels, constants, utils) | ✅ 완료 | -| V2-1c | packages/ui 추출 (DS 컴포넌트 + theme + theme-vars) | ⏸️ 대기 | +| V2-1c | packages/ui 추출 (DS 컴포넌트 + theme + theme-vars) | ✅ 완료 | | V2-1d | packages/i18n 추출 (locale JSON + 훅) | ⏸️ 대기 | +**V2-1c 완료 내역** +- `packages/ui/` (@d3ro/ui) 신규 생성: + - `src/theme.ts` (d3roPalette/d3roTypo/d3roShadow SSOT 전체) + - `src/theme-vars.ts` (팝업/main 프로세스용 CSS 변수 맵) + - `src/components/ds/{CrtDisplay, InstrumentPanel, Led, MetalCard, MetalDial, PhosphorText, PhysicalButton, ScreenPanel, ButtonGroup, index}.tsx` + - `src/index.ts` barrel +- `packages/ui/package.json`: React/MUI/Emotion은 **peerDependencies**, `@d3ro/core`만 직접 dep +- `apps/desktop/src/shared/` 디렉토리 완전 제거 (theme-vars가 마지막이었음) +- subpath exports: `./theme`, `./theme-vars`, `./components/ds` +- DS 컴포넌트 내부 `../../theme` 상대 경로는 그대로 유효 (packages/ui 내부에서 해결) +- **일괄 치환**: + - `../theme`, `../../theme`, `./theme` → `@d3ro/ui/theme` + - `../components/ds`, `../../components/ds`, `./ds`, `../ds` → `@d3ro/ui/components/ds` + - `../ds/`, `../../ds/` → `@d3ro/ui/components/ds` (세부 파일 import는 barrel로 통합) + - `@shared/theme-vars` → `@d3ro/ui/theme-vars` (WindowManager 1건) +- `apps/desktop/tsconfig.node/web.json`: `@shared/*` paths 완전 제거, `@d3ro/ui`, `@d3ro/ui/*` paths 추가, `include`에서 `src/shared/**/*` 제거 +- `electron.vite.config.ts`: `@shared` alias 제거, `@d3ro/ui` alias 추가, externalize exclude에 `@d3ro/ui` 추가 +- `vitest.config.ts`: alias 교체 + +**V2-1c 검증** +- `typecheck` ✅ +- `build` ✅ +- `dev` 런타임 ✅ (DB/핫키/Ollama/Main window 정상) +- `apps/desktop/src/shared/` 디렉토리 자체가 사라져 `@shared/*`는 이제 프로젝트에 존재하지 않음 + **V2-1b 완료 내역** - `packages/core/` 패키지 신규: `@d3ro/core`, subpath exports (types/errors/ipc-channels/constants/utils/*), docx dep 포함 - 6개 파일 `git mv`로 `packages/core/src/`로 이동: diff --git a/package-lock.json b/package-lock.json index 1d6d5ac..9b611e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "license": "MIT", "dependencies": { "@d3ro/core": "*", + "@d3ro/ui": "*", "@electron-toolkit/preload": "^3.0.2", "@electron-toolkit/utils": "^4.0.0", "@emotion/react": "^11.14.0", @@ -399,6 +400,10 @@ "resolved": "apps/desktop", "link": true }, + "node_modules/@d3ro/ui": { + "resolved": "packages/ui", + "link": true + }, "node_modules/@develar/schema-utils": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", @@ -12814,6 +12819,26 @@ "devDependencies": { "@types/node": "^22.13.0" } + }, + "packages/ui": { + "name": "@d3ro/ui", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@d3ro/core": "*" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0" + }, + "peerDependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@mui/icons-material": "^7.0.0", + "@mui/material": "^7.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } } } } diff --git a/packages/ui/package.json b/packages/ui/package.json new file mode 100644 index 0000000..c541ddf --- /dev/null +++ b/packages/ui/package.json @@ -0,0 +1,42 @@ +{ + "name": "@d3ro/ui", + "version": "1.0.0", + "private": true, + "description": "D3RO Voice 공유 UI — 디자인 시스템 컴포넌트 + 테마 토큰 + CSS 변수 맵", + "license": "MIT", + "main": "./src/index.ts", + "types": "./src/index.ts", + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./theme": { + "types": "./src/theme.ts", + "default": "./src/theme.ts" + }, + "./theme-vars": { + "types": "./src/theme-vars.ts", + "default": "./src/theme-vars.ts" + }, + "./components/ds": { + "types": "./src/components/ds/index.ts", + "default": "./src/components/ds/index.ts" + } + }, + "dependencies": { + "@d3ro/core": "*" + }, + "peerDependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@mui/icons-material": "^7.0.0", + "@mui/material": "^7.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0" + } +} diff --git a/apps/desktop/src/renderer/components/ds/ButtonGroup.tsx b/packages/ui/src/components/ds/ButtonGroup.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/ButtonGroup.tsx rename to packages/ui/src/components/ds/ButtonGroup.tsx diff --git a/apps/desktop/src/renderer/components/ds/CrtDisplay.tsx b/packages/ui/src/components/ds/CrtDisplay.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/CrtDisplay.tsx rename to packages/ui/src/components/ds/CrtDisplay.tsx diff --git a/apps/desktop/src/renderer/components/ds/InstrumentPanel.tsx b/packages/ui/src/components/ds/InstrumentPanel.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/InstrumentPanel.tsx rename to packages/ui/src/components/ds/InstrumentPanel.tsx diff --git a/apps/desktop/src/renderer/components/ds/Led.tsx b/packages/ui/src/components/ds/Led.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/Led.tsx rename to packages/ui/src/components/ds/Led.tsx diff --git a/apps/desktop/src/renderer/components/ds/MetalCard.tsx b/packages/ui/src/components/ds/MetalCard.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/MetalCard.tsx rename to packages/ui/src/components/ds/MetalCard.tsx diff --git a/apps/desktop/src/renderer/components/ds/MetalDial.tsx b/packages/ui/src/components/ds/MetalDial.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/MetalDial.tsx rename to packages/ui/src/components/ds/MetalDial.tsx diff --git a/apps/desktop/src/renderer/components/ds/PhosphorText.tsx b/packages/ui/src/components/ds/PhosphorText.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/PhosphorText.tsx rename to packages/ui/src/components/ds/PhosphorText.tsx diff --git a/apps/desktop/src/renderer/components/ds/PhysicalButton.tsx b/packages/ui/src/components/ds/PhysicalButton.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/PhysicalButton.tsx rename to packages/ui/src/components/ds/PhysicalButton.tsx diff --git a/apps/desktop/src/renderer/components/ds/ScreenPanel.tsx b/packages/ui/src/components/ds/ScreenPanel.tsx similarity index 100% rename from apps/desktop/src/renderer/components/ds/ScreenPanel.tsx rename to packages/ui/src/components/ds/ScreenPanel.tsx diff --git a/apps/desktop/src/renderer/components/ds/index.ts b/packages/ui/src/components/ds/index.ts similarity index 100% rename from apps/desktop/src/renderer/components/ds/index.ts rename to packages/ui/src/components/ds/index.ts diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts new file mode 100644 index 0000000..67842e6 --- /dev/null +++ b/packages/ui/src/index.ts @@ -0,0 +1,8 @@ +// packages/ui — barrel export +// 개별 sub-path import 권장: +// '@d3ro/ui/theme' — d3roPalette, d3roTypo, d3roShadow, d3roRadius 등 토큰 +// '@d3ro/ui/theme-vars' — 팝업/main 프로세스용 CSS 변수 맵 +// '@d3ro/ui/components/ds' — CrtDisplay, MetalCard, PhosphorText 등 DS 컴포넌트 + +export * from './theme' +export * from './components/ds' diff --git a/apps/desktop/src/shared/theme-vars.ts b/packages/ui/src/theme-vars.ts similarity index 100% rename from apps/desktop/src/shared/theme-vars.ts rename to packages/ui/src/theme-vars.ts diff --git a/apps/desktop/src/renderer/theme.ts b/packages/ui/src/theme.ts similarity index 100% rename from apps/desktop/src/renderer/theme.ts rename to packages/ui/src/theme.ts diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json new file mode 100644 index 0000000..2563e02 --- /dev/null +++ b/packages/ui/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true, + "jsx": "react-jsx", + "lib": ["ES2022", "DOM", "DOM.Iterable"] + }, + "include": ["src/**/*"] +}