diff --git a/.storybook/main.js b/.storybook/main.js index ef6deea..c20f6c8 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -1,19 +1,28 @@ /** @type { import('@storybook/react-vite').StorybookConfig } */ +import svgr from 'vite-plugin-svgr'; + const config = { - "stories": [ - "../src/**/*.mdx", - "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)" + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + addons: [ + '@chromatic-com/storybook', + '@storybook/addon-docs', + '@storybook/addon-onboarding', + '@storybook/addon-a11y', + '@storybook/addon-vitest', ], - "addons": [ - "@chromatic-com/storybook", - "@storybook/addon-docs", - "@storybook/addon-onboarding", - "@storybook/addon-a11y", - "@storybook/addon-vitest" - ], - "framework": { - "name": "@storybook/react-vite", - "options": {} - } + framework: { + name: '@storybook/react-vite', + options: {}, + }, + docs: { autodocs: 'tag' }, + viteFinal: async (cfg) => { + cfg.resolve = cfg.resolve || {}; + cfg.resolve.alias = { + ...(cfg.resolve.alias || {}), + '@': '/src', + }; + cfg.plugins = [...(cfg.plugins || []), svgr()]; + return cfg; + }, }; -export default config; \ No newline at end of file +export default config; diff --git a/.storybook/preview.js b/.storybook/preview.js index c73852a..3cd2c27 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -1,6 +1,12 @@ /** @type { import('@storybook/react-vite').Preview } */ + +// 전역 스타일: Tailwind나 앱 공통 CSS를 스토리북에도 적용 +import '../src/index.css'; + const preview = { parameters: { + layout: 'centered', // 스토리북 미리보기 영역 중앙 정렬 (컴포넌트 확인 편함) + // Controls 패널에서 color/date 인풋을 자동 매핑 controls: { matchers: { color: /(background|color)$/i, @@ -8,13 +14,30 @@ const preview = { }, }, + // 접근성 테스트 설정 (현재: UI에서만 표시) a11y: { - // 'todo' - show a11y violations in the test UI only - // 'error' - fail CI on a11y violations - // 'off' - skip a11y checks entirely + // 'todo' - 테스트 UI에만 표시 + // 'error' - CI에서 에러로 처리 + // 'warn' - CI에서 경고로 처리 + // 'off' - 테스트 비활성화 test: 'todo', }, + + // 배경 프리셋(선택): 컴포넌트 대비 확인용 + backgrounds: { + default: 'plain', + values: [ + { name: 'plain', value: '#ffffff' }, + { name: 'app-gray', value: '#f5f5f5' }, + { name: 'dark', value: '#1f2937' }, + ], + }, }, + + // 전역 데코레이터가 필요하면 여기에 추가 (예: 테마 Provider, Router 등) + // decorators: [ + // (Story) => () + // ], }; export default preview; diff --git a/package-lock.json b/package-lock.json index 81b4a59..bdfc258 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.0", "react-icons": "^5.5.0", "react-router-dom": "^7.6.2", - "vite-plugin-svgr": "^4.3.0", + "vite-plugin-svgr": "^4.5.0", "zustand": "^5.0.5" }, "devDependencies": { @@ -9303,12 +9303,12 @@ } }, "node_modules/vite-plugin-svgr": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", - "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.5.0.tgz", + "integrity": "sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==", "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^5.1.3", + "@rollup/pluginutils": "^5.2.0", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0" }, diff --git a/package.json b/package.json index 7c79553..750c7c3 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "react-dom": "^19.1.0", "react-icons": "^5.5.0", "react-router-dom": "^7.6.2", - "vite-plugin-svgr": "^4.3.0", + "vite-plugin-svgr": "^4.5.0", "zustand": "^5.0.5" }, "devDependencies": { diff --git a/src/app/index.jsx b/src/app/index.jsx index 0621930..88b7f9b 100644 --- a/src/app/index.jsx +++ b/src/app/index.jsx @@ -1,3 +1,5 @@ +// 전역 컨텍스트 및 상태 관리 설정 (라우팅, 인증 등) + import { BrowserRouter, Routes, @@ -5,16 +7,18 @@ import { useLocation, Navigate, } from 'react-router-dom'; + +import Header from '../widgets/navigation/Header'; +import Footer from '../widgets/navigation/Footer'; + import Home from '../pages/home'; import TrackInfo from '../pages/info'; import NotFound from '../pages/NotFound'; import Search from '../pages/Search'; import Splash from '../pages/splash'; -import Header from '../widgets/navigation/Header'; -import Footer from '../widgets/navigation/Footer'; import Login from '../pages/login'; import MyPage from '../pages/my'; -import UploadSection from '../components/UploadSection'; +import TrackDataUploadModal from '../features/track-management/components/TrackDataUploadModal'; function App() { return ( @@ -40,7 +44,7 @@ function AppContent() { } /> } /> } /> - } /> + } /> } /> {!shouldHideHeaderFooter &&