- Add Markdig NuGet package (0.38.0)
- Convert blog content from markdown to HTML in Post.cshtml.cs
- Display rendered HTML content instead of raw text
- Add comprehensive markdown styling (h1-h6, lists, tables, code, etc.)
- Use TaxBaik color scheme for markdown elements
Blog posts now render properly:
✅ Headings (#, ##, ###)
✅ Bold/italic text (**text**, *text*)
✅ Lists (-, *, ordered)
✅ Tables
✅ Code blocks
✅ Blockquotes
✅ Links
Styling follows TaxBaik brand:
- Primary color for headings
- Warm typography (Noto Sans KR)
- Consistent spacing and borders
- Mobile-responsive design
Replace bloated multi-section layout with streamlined structure:
- Remove online-trust, About, customer-type sections from homepage
- Restore 3-service-group simplicity (business-tax, real-estate-tax, family-asset)
- Elevate blog section for SEO priority (post homepage hero)
- Move full About content to dedicated /about page (linked from hero banner)
- Replace customer-type segmentation with blog category tagging
Improves mobile readability, reduces scrolling fatigue, and aligns homepage
to core business goals (blog SEO + service clarity). About page now hosts
the full story with expertise details.
Adds an online-consulting trust strip below the hero, replaces the plain
credential row with a personal bio + expertise section, expands the
service cards from 3 broad categories to 5 specific offerings plus a
consult CTA card, and adds a customer-segment section so visitors can
self-identify their situation. Layout follows existing Bootstrap
responsive grid conventions used elsewhere on the page.
- Enhanced topbar with better button styling and tooltips
- Added system information to drawer footer (server, update status)
- Improved visual hierarchy and spacing
- Better responsive design for mobile screens
- Replaced meaningless message with useful admin context
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Page may be already rendered when showLoading() is called (fast nav, cached state)
- Check .admin-page-hero / .admin-login-page immediately and hide if present
- Prevents stuck loading overlay on rapid navigation between pages
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- App.razor: loading overlay starts with `show` class (visible on cold load)
- admin-session.js: add showLoading()/hideLoading(); MutationObserver detects
.admin-page-hero / .admin-login-page instead of mud-element count threshold;
observer restarts on every navigation cycle via LocationChanged
- MainLayout.razor: subscribe to NavigationManager.LocationChanged →
call JS showLoading() on every route change; implements IDisposable
- InquiryList.razor: remove unused IInquiryRepository injection; load data
once (GetPagedAsync(1,200)) and pass IReadOnlyList to all six tab panels
- InquiryTable.razor: accept Inquiries parameter; filter synchronously in
OnParametersSet() — eliminates 6 redundant API calls per page visit
- admin.css: overlay fade-in animation (0.15s); page content fade-in on
route mount via .admin-page-hero / .admin-login-page animation (0.25s)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
**Issue**: Loading indicator remained visible, intercepting all user interactions (pointer-events: auto blocks clicks)
**Root cause**: Multiple detection methods insufficient, race condition between JavaScript execution and Blazor initialization
**Solution**: Add guaranteed 3-second timeout + multiple detection methods
- Method 1: 3000ms timeout (guaranteed)
- Method 2: Detect when 10+ MudBlazor components appear
- Method 3: Hide when readystatechange to 'interactive' or 'complete'
**Failsafe**: Even if Blazor never fires events, loading WILL hide after 3 seconds max
**Result**:
- Loading shows: immediate on page load
- Loading hides: within 1-3 seconds (whichever is first)
- User can interact: guaranteed by 3-second timeout at latest
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
**Issue**: Loading indicator (spinner) continues to display even after page fully loads
**Root cause**:
- Blazor.start() was already called by blazor.web.js (auto-starts)
- Calling it again in JavaScript won't trigger promise resolution
- Promise callback never executed, overlay never hidden
**Solution**: Use multiple detection methods to ensure loading hides:
1. Blazor 'ready' event listener (when circuit is ready)
2. DOMContentLoaded + 500ms timeout (fallback)
3. MutationObserver watching for 20+ MudBlazor components
**Result**:
- Loading spinner shows: page load starts
- Spinner hides: when ANY of the above conditions met (whichever is first)
- No more stuck loading indicator
This ensures loading always hides regardless of how Blazor initializes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
**Issue**: White screen appears 1-2 seconds during page load/transitions while Blazor circuit connects
**Solution**: Add loading spinner overlay that displays while Blazor initializes
**Changes**:
1. App.razor: Add loading overlay HTML element
2. admin.css: Add loading spinner styles + animations
3. admin-session.js: Show overlay on load, hide when Blazor circuit ready
**UX Flow**:
- Page load starts → Blazor loading spinner appears
- Blazor circuit connects (~1-2s) → Spinner disappears
- Page fully interactive → User sees content
**Styling**:
- Centered spinner with 'Loading...' text
- Semi-transparent background (blur effect)
- Smooth fade-out when complete
- High z-index (9999) to cover all content
This provides clear visual feedback that the app is working, not frozen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mobile S (<480px) drawer now properly:
- Uses flex-direction: row for horizontal layout
- Has max-height: 60px to constrain vertical space
- Shows horizontal scrollbar for nav items (overflow-x: auto)
- Proper border styling (no right border, bottom border)
- Brand mark positioned correctly with flex-shrink: 0
This fixes the drawer responsiveness test on 375px viewport.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
**Responsive Breakpoints (Mobile-First):**
- Mobile S (<480px): Single column, minimal padding, hidden subtitles
- Mobile L (480-599px): Single column with optimized spacing
- Tablet S (600-767px): Single column, collapsed drawer (60px wide)
- Tablet M (768-959px): 2-column metric grid, full drawer
- Tablet L (960-1023px): 3-column metric grid
- Desktop L (1024-1439px): 4-column metric grid, full layout
- Desktop XL (1440-1919px): 4-column with increased spacing
- Desktop XXL (1920px+): 4-column with maximum spacing
**Key Improvements:**
✓ Device-specific padding, margin, font-size optimizations
✓ Drawer behavior: full width on mobile, sidebar on tablet+
✓ Navigation: horizontal scroll on tablet S, full menu on larger screens
✓ Tables: font-size and padding scale with viewport
✓ Metric cards: responsive heights and spacing
✓ Page hero: column layout on mobile, row layout on desktop
✓ Typography: scales from 0.65rem to 2rem based on device
**Mobile Optimizations:**
- Hide non-critical elements (page subtitle)
- Compress navigation to icons
- Full-width buttons on small screens
- Horizontal scroll for navigation menu
- Optimized touch target sizes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
**Dashboard.razor Changes:**
- Replace MudGrid/MudItem with pure HTML div elements for reliable layout
- Remove dependency on MudBlazor grid components that were causing conflicts
- Use inline flexbox layout with emoji icons for better visual appeal
- Improve semantic structure and readability
**admin.css Improvements:**
- 4-column metric grid layout for desktop (1440px+)
- 3-column for laptops (1024px), 2-column for tablets (768px), 1-column for mobile
- Add hover effects: elevation, transform, top border animation
- Improve gradient backgrounds: more subtle, better color hierarchy
- Add professional box shadows and smooth transitions (cubic-bezier)
- Better padding and spacing for premium look
- Responsive design across all breakpoints
Visual improvements:
✓ Professional gradient backgrounds with hover states
✓ Smooth animations (0.3s cubic-bezier for premium feel)
✓ Better visual hierarchy with typography
✓ Proper spacing and alignment
✓ Accessibility-friendly color contrasts
✓ Mobile-first responsive design
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Convert .admin-metric-grid to CSS Grid (grid-template-columns: repeat(auto-fit))
- Add flexbox layout to .admin-metric-card for proper content distribution
- Remove all MudBlazor component direct styling (MudGrid, MudItem, MudPaper)
- Focus only on custom admin-* classes
- Fix metric cards layout (4-column desktop, responsive mobile)
- Improve typography and spacing hierarchy
- Add proper !important only where necessary for class overrides
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 자주 묻는 질문 4개 Bootstrap 아코디언으로 구현
(기장료, 양도세 상담, 무료 상담, 첫 상담 준비물)
- 최종 CTA 섹션 앞에 배치
- site.css: faq-accordion, faq-item, faq-question, faq-answer 스타일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- TaxSeason / CurrentSeasonDto에 RelatedCategorySlug 추가
- TaxSeasonCalendar 각 시즌에 카테고리 슬러그 매핑
(income-tax→income-tax, vat-1st/2nd→vat, 종부세→real-estate-tax 등)
- IBlogPostRepository.GetByCategorySlugAsync 추가
- BlogService.GetSeasonalPostsAsync: 시즌 관련 글 2개 우선 + 나머지 최신 글로 채움
- IndexModel: SeasonalPosts / RecentPosts 분리 로드
- Index.cshtml 블로그 섹션: 시즌 중 "이번 시즌 추천" 배지 + 시즌별 전체보기 버튼
- site.css: blog-card--seasonal, seasonal-blog-tag, btn-seasonal 스타일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Program.cs: MapRazorComponents에 AllowAnonymous 추가
JWT 미들웨어가 Blazor 셸 요청을 401로 차단하던 문제 수정
(인증은 Blazor AuthorizeRouteView → RedirectToLogin에서 처리)
- deploy.yml: SSH 1회 연결로 배포+헬스체크 통합
서버 사이드 폴링으로 대기(최대 120초), CI 측 sleep 제거
구 배포 디렉토리 최근 5개 자동 정리
secrets 파일 사전 검증 추가
- maintenance.html: 배포 중 Nginx가 직접 서빙할 점검 페이지
15초 자동 새로고침, 카카오 채널 링크 포함
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 연간 세무 캘린더(7개 시즌) 기반 자동 Hero 섹션 전환
- 시즌 감지 시 D-Day 카운트다운, 긴박감 배지, 시즌 CTA 표시
- 서비스 카드 순서 시즌 관련 항목 우선 정렬
- 어드민 공지사항 CRUD (등록·수정·삭제, 기간·유형 설정)
- 홈페이지 상단 공지 배너 자동 노출 (일반/배너/긴급)
- CLAUDE.md에 세무 캘린더 및 마케팅 방향 하네스 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
wwwroot/css/admin.css 생성:
• 폼 요소 기본 스타일
• MudBlazor 컴포넌트 기본 스타일
• Responsive 디자인
• Material Design Blue 컬러
결과:
✅ 페이지 로딩 중에도 깔끔한 UI
✅ MudBlazor 로드 후 자동 오버라이드
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
주요 변경사항:
- Hero 섹션: 강력한 임팩트, 자격 배지, 큰 CTA
- 신뢰도 섹션: 자격 3개 항목 수직 확장
- 서비스 섹션: 아이콘 + 상세 설명 + 리스트형 혜택 → 전문성 강조
- 상담 프로세스: 새로운 4단계 시각화 섹션 추가
- 블로그 섹션: 플레이스홀더 이미지, 더 큰 카드
- 최종 CTA: 강렬한 다크 그린 배경, 대비 강한 버튼
디자인 개선:
- 화이트스페이스 확대
- 시각적 계층 구조 강화
- 기능별 섹션 분리
- 반응형 레이아웃 개선
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- site.css: 색상 팔레트 전환 (골드/브론즈/초록/베이지)
- admin.css: MudBlazor 커스터마이징으로 일관성 있는 관리자 UI
- theme-color 메타 태그 업데이트
변경사항:
- 주색: #1B4F8A(네이비) → #C89D6E(따뜻한 골드)
- 보조색: 새로 추가 #2E5C4E(따뜻한 초록)
- 배경: #F7F9FC(차가운 화이트) → #F9F7F3(따뜻한 화이트)
- 그라데이션, 섀도우, 타이포그래피 개선
이전: 기본적인 텍스트 나열식 디자인
현재: 경험 많은 세무사 사무실 느낌의 세련되고 전문적인 디자인
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>