diff --git a/LOG.md b/LOG.md index da08f3d..3b5b464 100644 --- a/LOG.md +++ b/LOG.md @@ -26,3 +26,12 @@ - `NEXT_PUBLIC_API_URL=https://blogserver.wypark.me npm run build`를 네트워크 허용 상태로 실행해 sitemap fetch까지 포함한 production build를 검증했다. - 검증: `npm run lint` 통과, `NEXT_PUBLIC_API_URL=https://blogserver.wypark.me npm run build` 통과. 로컬 `localhost:3000`에서 배포 API를 직접 붙이는 브라우저 검증은 백엔드 CORS 정책상 `https://blog.wypark.me`만 허용되어 제한된다. - 다음 추천 작업: 프론트 배포 후 `https://blog.wypark.me/admin`에서 실제 관리자 로그인 상태로 dashboard 실데이터 렌더링과 range 전환을 최종 확인한다. + +## 2026-05-28 + +- Browser로 배포 블로그(`https://blog.wypark.me`)를 직접 둘러보고 대표글 카드가 비어 보이는 현상, 검색 입력/로그인/관리자 하위 화면의 다크모드 누락을 확인했다. +- 대표글이 1개뿐일 때 최신 글 패널이 빈 영역처럼 보이지 않도록 홈 featured/latest 레이아웃을 조정했다. +- 검색 입력, 로그인 화면, 댓글 UI를 토큰 기반 surface/text/input 스타일로 정리했다. +- 관리자 게시글/댓글/카테고리/프로필처럼 기존 Tailwind neutral class를 쓰는 화면도 다크모드에서 깨지지 않도록 전역 dark compatibility 레이어를 보강했다. +- 검증: `npm run lint` 통과, `npm run build` 통과. build 중 sitemap fetch는 샌드박스 네트워크 제한으로 경고가 출력됐지만 exit 0으로 완료됐다. `npm run dev` 후 Browser로 `/`, `/?keyword=network`, `/login`, 로그아웃 상태 `/admin` 리다이렉트, 관리자 하위 화면 로컬 미리보기를 확인했다. +- 다음 추천 작업: 프론트 배포 후 실제 관리자 로그인 상태에서 `/admin/posts`, `/admin/comments`, `/admin/categories`, `/admin/profile`의 데이터 로딩 상태와 다크모드 hover/focus를 production Origin에서 최종 확인한다. diff --git a/src/app/globals.css b/src/app/globals.css index a71df80..2f6eb92 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -61,6 +61,147 @@ body { color: var(--color-text); } +@media (prefers-color-scheme: dark) { + /* Keep older Tailwind-only surfaces aligned with the app color tokens. */ + .bg-white { + background-color: var(--color-surface-strong); + } + + .bg-gray-50, + .bg-gray-100 { + background-color: rgba(255, 255, 255, 0.08); + } + + .bg-blue-50, + .bg-blue-100 { + background-color: rgba(10, 132, 255, 0.14); + } + + .bg-red-50, + .bg-red-100 { + background-color: rgba(255, 69, 58, 0.13); + } + + .bg-green-100 { + background-color: rgba(48, 209, 88, 0.14); + } + + .border-gray-100, + .border-gray-200, + .border-gray-300 { + border-color: var(--color-line); + } + + .border-blue-100 { + border-color: rgba(10, 132, 255, 0.28); + } + + .border-red-100 { + border-color: rgba(255, 105, 97, 0.28); + } + + .text-gray-950, + .text-gray-900, + .text-gray-800, + .text-gray-700 { + color: var(--color-text); + } + + .text-gray-600, + .text-gray-500 { + color: var(--color-text-muted); + } + + .text-gray-400, + .text-gray-300 { + color: var(--color-text-subtle); + } + + .text-blue-700, + .text-blue-600 { + color: #8ecbff; + } + + .text-red-950, + .text-red-700, + .text-red-600 { + color: #ffb4ad; + } + + .text-green-600 { + color: #8ff0a4; + } + + .divide-gray-100 > :not([hidden]) ~ :not([hidden]) { + border-color: var(--color-line); + } + + .hover\:bg-white:hover, + .hover\:bg-gray-50:hover, + .hover\:bg-gray-100:hover, + .hover\:bg-gray-200:hover, + .focus\:bg-white:focus { + background-color: rgba(255, 255, 255, 0.11); + } + + .hover\:bg-blue-50:hover { + background-color: rgba(10, 132, 255, 0.16); + } + + .hover\:bg-red-50:hover { + background-color: rgba(255, 69, 58, 0.16); + } + + .hover\:text-gray-600:hover, + .hover\:text-gray-700:hover, + .hover\:text-gray-800:hover { + color: var(--color-text); + } + + .placeholder\:text-gray-300::placeholder, + .placeholder\:text-gray-400::placeholder { + color: var(--color-text-subtle); + } + + .disabled\:bg-gray-50:disabled, + .disabled\:bg-gray-300:disabled, + .disabled\:bg-gray-400:disabled { + background-color: rgba(255, 255, 255, 0.1); + color: var(--color-text-subtle); + } + + input:not([type="checkbox"]):not([type="radio"]), + textarea, + select { + background-color: rgba(255, 255, 255, 0.08); + border-color: var(--color-line); + color: var(--color-text); + } + + input:not([type="checkbox"]):not([type="radio"]):focus, + textarea:focus, + select:focus { + background-color: rgba(255, 255, 255, 0.11); + border-color: var(--color-accent); + } + + input::placeholder, + textarea::placeholder { + color: var(--color-text-subtle); + } + + option { + background-color: var(--color-surface-strong); + color: var(--color-text); + } + + .shadow-xl, + .shadow-md, + .shadow-sm { + box-shadow: var(--shadow-card); + } +} + .w-md-editor { border-radius: 0.75rem !important; /* 둥근 모서리 */ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); @@ -71,3 +212,15 @@ body { border-radius: 0.75rem 0.75rem 0 0 !important; background-color: #f9fafb !important; } + +@media (prefers-color-scheme: dark) { + .w-md-editor { + background-color: var(--color-surface-strong) !important; + border-color: var(--color-line) !important; + } + + .w-md-editor-toolbar { + background-color: rgba(255, 255, 255, 0.08) !important; + border-color: var(--color-line) !important; + } +} diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 75c0f9e..9a91b02 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -58,33 +58,33 @@ function LoginForm() { }; return ( -
블로그에 오신 것을 환영합니다.
+블로그에 오신 것을 환영합니다.