Commit graph

319 commits

Author SHA1 Message Date
c201de203e feat: 추천 검색어 시스템 구현 (kiwi-nlp 형태소 분석)
- kiwi-nlp 기반 한국어 형태소 분석기 추가
- 추천 검색어 API 구현 (/api/schedules/suggestions)
  - Prefix 매칭, Bi-gram 다음 단어 예측
  - 초성 검색 지원, 영문→한글 자동 변환 (Inko)
- 사용자 사전 추가 (멤버/그룹명, 프로그램명 등)
- DB 테이블: suggestion_queries, suggestion_word_pairs, suggestion_chosung

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 13:01:29 +09:00
b89255780e refactor: 일정 API 응답 형식에 맞게 프론트엔드 수정
- API 응답(날짜별 그룹화)을 플랫 배열로 변환하는 로직 추가
- 별도 카테고리 API 호출 제거, 일정 데이터에서 카테고리 추출
- PC/모바일 Schedule.jsx, AdminSchedule.jsx 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 17:52:15 +09:00
a5ed04e9af feat: 일정 API 추가
- GET /api/schedules?year=&month= 월별 일정 조회
- 날짜별 그룹화 + 카테고리 목록/개수 포함
- 유튜브 카테고리의 경우 source_name(채널명) 반환

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 16:50:16 +09:00
8b65f61e47 refactor: members, stats 라우트 폴더 구조로 변경
- members.js → members/index.js
- stats.js → stats/index.js
- 일관된 폴더 구조로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 13:02:40 +09:00
b0f7169226 refactor: API 라우트 구조 통합 및 파일 분리
- /api/admin/* + /api/* 분리 구조를 /api/*로 통합
- GET 요청은 공개, POST/PUT/DELETE는 인증 필요로 변경
- albums 라우트를 기능별 파일로 분리 (index, photos, teasers)
- 프론트엔드 API 호출 경로 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 13:01:35 +09:00
428a74a703 feat: 대시보드 통계 API 추가
- /api/admin/stats 라우트 추가 (멤버, 앨범, 사진, 일정, 트랙 수)
- AdminDashboard에서 단일 API 호출로 통계 조회
- useQuery로 변경하여 중복 요청 방지
- AnimatedNumber 컴포넌트에 3자리 쉼표 및 애니메이션 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 00:08:16 +09:00
86220bdd3d refactor: 앨범 관리 페이지 useEffect를 useQuery로 변경
- AdminAlbums.jsx: useQuery로 앨범 목록 조회, 삭제 후 캐시 무효화
- AdminAlbumForm.jsx: useQuery로 앨범 상세 조회, 저장 후 캐시 무효화
- AdminAlbumPhotos.jsx: useQuery로 앨범/사진/티저/멤버 조회
- backend: 정적 파일 서빙 추가 (프로덕션 모드용)
- backend: 앨범 라우트에 인증 미들웨어 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:40:47 +09:00
f5ae81d21a feat: 앨범 관리 API 구현 및 프론트엔드 연동
Backend:
- 앨범 CRUD API 구현 (목록, 상세, 생성, 수정, 삭제)
- 앨범 사진 관리 API 구현 (업로드, 삭제, 티저 관리)
- 이미지 서비스에 앨범 관련 함수 추가
- Public 라우트 추가 (앨범, 멤버 공개 API)

Frontend:
- AdminAlbums.jsx admin API로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:16:41 +09:00
6462949bc7 refactor: 어드민 페이지 인증 로직을 useAdminAuth 훅으로 통합
- 8개 어드민 페이지에서 중복된 인증 코드 제거
- localStorage 직접 접근 → useAdminAuth 훅 사용
- authApi.hasToken()/verifyToken() 호출 제거
- 일관된 인증 상태 관리 (5분 캐시, 자동 리다이렉트)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:10:30 +09:00
d44537d870 멤버 관리 API 구현 및 프론트엔드 연동
Backend:
- 멤버 CRUD API 추가 (routes/admin/members.js)
- 이미지 업로드 서비스 추가 (services/image.js)
  - S3에 3가지 해상도로 저장 (original, medium_800, thumb_400)
- multipart 플러그인 등록

Frontend:
- useAdminAuth 커스텀 훅 추가 (토큰 검증 API 사용)
- AdminMembers, AdminMemberEdit useQuery로 변경
- 로그인 확인 로직 중복 제거
- 수정 완료 시 목록 페이지로 이동 및 토스트 표시

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-16 23:01:23 +09:00
1cb430907f refactor: 멤버 관리 페이지 UI 수정
- API 연동 임시 제거, 더미 데이터로 대체
- position 필드 제거
- 별명(nicknames) 태그 입력 UI 추가
- DB 변경: members 테이블 position/image_url 제거, image_id 추가
- DB 변경: member_nicknames 테이블 생성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 21:53:55 +09:00
613c4c69a5 feat: 어드민 로그인 API 구현
- @fastify/jwt 플러그인 기반 인증 시스템
- POST /api/admin/login: 로그인 (JWT 토큰 발급)
- GET /api/admin/verify: 토큰 검증
- bcrypt 비밀번호 해싱 검증
- JWT 설정 config 분리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 21:38:54 +09:00
19ba8bcddf refactor: Express에서 Fastify로 백엔드 마이그레이션
- Express → Fastify 5 프레임워크 전환
- 플러그인 기반 아키텍처로 재구성
  - plugins/db.js: MariaDB 연결 풀
  - plugins/redis.js: Redis 클라이언트
  - plugins/scheduler.js: 봇 스케줄러 (node-cron)
- 봇 설정 방식 변경: DB 테이블 → 설정 파일 (config/bots.js)
- 봇 상태 저장: DB → Redis
- YouTube/X 봇 서비스 분리 및 개선
- 날짜 유틸리티 KST 변환 수정
- 미사용 환경변수 정리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 21:11:02 +09:00
51030e3aba fix: X 카테고리 페이지 브레드크럼/카드 정렬 일치
- X 카테고리 브레드크럼에 max-w-2xl mx-auto 적용
- 카드와 동일한 너비로 중앙 정렬
2026-01-16 11:02:23 +09:00
40e1f957c7 refactor: ScheduleDetail 컴포넌트 카테고리별 파일 분리
- schedule-sections 폴더 생성
- YoutubeSection, XSection, ConcertSection, DefaultSection 분리
- KakaoMap, utils.js 공통 모듈 분리
- 메인 ScheduleDetail.jsx 1010줄 → 175줄로 간소화
2026-01-16 10:55:40 +09:00
9d6d4a1ad3 refactor: 모바일 스케줄 페이지 수정 2026-01-16 02:16:03 +09:00
28e48614ce refactor: 콘서트 상세 페이지 UI 개선
- 히어로 섹션 배경을 포스터 확대 + 블러 효과로 변경
- 회차 선택을 드롭다운 형태로 변경 및 디자인 개선
- 드롭다운 열릴 때 선택된 항목 자동 스크롤
- 장소 카드 디자인 정리 (MapPin 아이콘 사용)
- 지도 높이 2배로 증가 (h-64 → h-[32rem])
- 길찾기 버튼 색상 분기 (카카오맵: #0079f4, 구글맵: #4285F4)
- 글래스모피즘 효과 제거
2026-01-16 02:15:32 +09:00
b023e08750 fix: 일정 상세 화면 UI 개선
PC/모바일 웹:
- 콘서트 선택된 일정 텍스트 볼드체 제거
- 모바일 콘서트 헤더 장소 표시 제거
- 모바일 콘서트 포스터 여백 제거

Flutter 앱:
- lucide_icons 사용하여 웹과 동일한 아이콘 적용
- 콘서트 헤더 장소 제거 및 포스터 여백 제거
- 콘서트 선택된 일정 볼드체 제거
- 지도 플레이스홀더 추가 (탭시 카카오맵 이동)
- 길찾기 버튼 색상 blue-500으로 변경
- 유튜브 섹션: 숏츠 둥근 테두리, 버튼 제거, 유튜브 아이콘으로 교체
- X 섹션: 웹과 동일한 디자인 (프로필, @username, 인증배지, X로고 버튼)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 21:39:29 +09:00
122460b2ad feat: Flutter 앱 일정 상세 화면 구현
- ScheduleDetail, ScheduleMember, RelatedDate 모델 추가
- getSchedule API 서비스 함수 추가
- schedule_detail_view.dart 구현 (유튜브, X, 콘서트, 기본 섹션)
- 라우터에 /schedule/:id 경로 추가
- 일정 목록 및 검색 결과에서 상세 화면 이동 기능 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 21:27:24 +09:00
7d96407bfe 모바일 콘서트 섹션 개선 및 달력 일정 점 표시 수정
- 콘서트 UI 최적화: 포스터 썸네일화, 공연 일정 세로 배치
- 카카오맵 SDK 연동으로 실제 지도 표시
- 회차 변경 시 keepPreviousData로 부드러운 전환
- 달력 다른 달 이동 시 일정 점 표시 (비동기 조회)
- PC 콘서트 섹션 그림자 통일 (shadow-lg shadow-black/5)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 21:20:27 +09:00
8ec2b1d6be 모바일 일정 상세 페이지 X 섹션 구현
- X 스타일 카드 UI (프로필, 본문, 이미지, 날짜)
- 프로필 정보 API 연동 (getXProfile)
- X 스타일 날짜/시간 포맷팅
- X에서 보기 버튼

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 21:02:48 +09:00
e4859471ba 모바일 일정 상세 페이지 구현 (유튜브 섹션)
- 모바일 일정 상세 페이지 기본 구조 구현
- 유튜브 섹션: 일반 영상/숏츠 구분 렌더링
- 전체화면 시 가로 회전 (숏츠 제외)
- 일정 목록에서 상세 페이지로 이동 클릭 이벤트 추가
- mobile-layout 클래스 시스템으로 스크롤바 숨김 처리
- zustand store로 날짜 상태 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 20:57:55 +09:00
f51a3f754a feat: 모바일 일정 상세 페이지 및 에러 UI 추가
- MobileScheduleDetail 컴포넌트 생성
- 404 에러 페이지 UI (애니메이션 포함)
- /schedule/:id 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 20:12:23 +09:00
6275f0f92a feat: 생일 기능 추가 및 일정 페이지 개선
- 생일 카드 컴포넌트 추가 (PC/모바일)
- 생일 폭죽(confetti) 애니메이션 적용 (하루에 한 번)
- 생일 상세 페이지 추가 (/birthday/멤버이름/년도)
- 관리자 일정 페이지에 생일 표시 (수정/삭제 버튼 숨김)
- 일정 상세 페이지 404 에러 UI 개선
- 일정 상세 페이지 불필요한 재시도 방지 (retry: false)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 20:09:26 +09:00
611a20a8f0 feat: 콘서트 상세 페이지 개선
- 같은 제목의 콘서트 일정을 모아서 회차별로 표시
- 현재 보고 있는 회차 강조 표시
- 카카오맵 SDK 키 수정 및 에러 처리 개선
- 길찾기 버튼 추가
- 회차 전환 시 부드러운 데이터 로딩 (keepPreviousData)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 17:05:33 +09:00
79f3816cec feat: 콘서트 카테고리 상세 페이지 추가
- KakaoMap 컴포넌트: 위도/경도 기반 지도 표시 기능
- ConcertSection: 포스터 이미지, 날짜 범위, 장소 정보 표시
- 위치 좌표가 없는 경우(해외) 장소명만 표시
- 백엔드 API에 이미지 정보 포함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 15:23:40 +09:00
edf6b60b4a refactor: 일정 페이지 상태 관리를 zustand store로 변경
- Schedule.jsx에서 useState 대신 useScheduleStore 사용
- 상세 페이지 이동 후에도 선택한 날짜/카테고리/검색어 유지
- X 상세 페이지 UI 개선 (X 아이콘 제거, 날짜 형식 변경)
- X 프로필 URL 디코딩 로직 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 15:19:44 +09:00
4f0cf724d0 feat: X 카테고리 상세 페이지 및 프로필 캐싱 기능 추가
- X 봇에서 Nitter 프로필 정보(이름, 아바타) 추출 및 Redis 캐싱
- X 프로필 조회 API 추가 (/api/schedules/x-profile/:username)
- X 상세 페이지 UI 구현 (트위터 카드 스타일)
- X 카테고리 클릭 시 상세 페이지로 이동하도록 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 14:51:59 +09:00
c94849d42a feat(frontend): PC 일정 상세 페이지 추가
- 유튜브 카테고리 상세 페이지 구현 (영상 임베드 + 정보)
- 숏츠/일반 영상 레이아웃 분리
- 브레드크럼 네비게이션 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 14:42:34 +09:00
2ebee0682c fix(backend/x-bot): 고정 트윗 다음 트윗이 무시되는 버그 수정
- 고정 트윗 체크 로직이 이전 컨테이너를 참조하여 다음 트윗도 고정으로 판단하는 버그 수정
- 현재 컨테이너 내에 'class="pinned"'가 있는지만 확인하도록 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 14:02:53 +09:00
94fc7b4c7f feat(frontend): PC/모바일 404 페이지 추가
- PC/모바일 각각 사이트 스타일에 맞는 404 페이지 생성
- framer-motion 애니메이션 적용
- PC Layout 수정으로 푸터 하단 고정
- 모바일은 100dvh로 스크롤 없이 전체 화면 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 09:57:28 +09:00
25decd238b style(app/schedule): 달력 애니메이션 속도 및 간격 조정
- 달력 열기/닫기 애니메이션 속도 조정 (200ms → 280ms)
- 날짜 스크롤 애니메이션 속도 조정 (150ms → 220ms)
- 달력 요일-날짜 간격 확대 (12px → 16px)
- 날짜 그리드 세로 간격 및 셀 높이 확대

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 09:45:01 +09:00
033047ebdb perf(app/members): 카드 스와이프 성능 최적화 및 스케일 조정
- AnimatedBuilder child 캐싱으로 매 프레임 rebuild 방지
- RepaintBoundary 추가로 리페인트 범위 제한
- 양옆 카드 스케일 비율 조정 (0.15 → 0.25)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 09:40:47 +09:00
fcf800f975 fix(app/schedule): 날짜 스크롤 가운데 정렬 및 divider 너비 수정
- 날짜 선택 시 ListView padding을 고려하여 정확히 가운데로 스크롤
- 일정 카드의 멤버 divider가 콘텐츠 영역 전체 너비를 채우도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 09:09:49 +09:00
7f96ab5fb2 feat(app/schedule): 최근 검색기록 기능 추가 및 UI 개선
- 최근 검색기록 기능 추가 (SharedPreferences로 최대 10개 저장)
- 추천 검색어 입력 시 프로그레스바 제거
- 추천 검색어 클릭 효과 제거 (InkWell → GestureDetector)
- 달력 요일/날짜 그리드 상단 여백 축소
- 달력 그리드와 오늘 버튼 사이 간격 증가
- 검색 종료 시 날짜 선택 부분 중앙 스크롤

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-14 09:12:14 +09:00
2de5cb8f93 feat(mobile/schedule): 검색 UX 개선 및 데이트픽커 스타일 수정
- 데이트픽커 년/월 선택에서 오늘 날짜 초록색 강조
- 검색어 변경 시 스크롤 초기화 개선 (requestAnimationFrame)
- 유튜브 스타일 검색 UX 구현
  - X 버튼 클릭 시 추천 검색어 화면으로 전환
  - 뒤로가기 시 검색 결과 복원 및 검색어 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 23:06:08 +09:00
02fe9314e4 fix(suggestions): 동적 임계값으로 추천 검색어 필터링
- 최대 검색 횟수의 1% 또는 최소 10회 중 더 큰 값 적용
- GREATEST(MAX(count) * 0.01, 10) 사용
- 데이터가 적을 때도 오타 필터링 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 22:49:35 +09:00
88f15a3ec1 refactor(schedule): 위젯 파일 분리
- schedule_view.dart에서 위젯들을 별도 파일로 분리
  - widgets/member_chip.dart: MemberChip, SearchMemberChip
  - widgets/schedule_card.dart: ScheduleCard, AnimatedScheduleCard
  - widgets/search_card.dart: SearchScheduleCard
- 공용 유틸 함수 분리 (decodeHtmlEntities, parseColor)
- 파일 크기 2001줄 → 1440줄 (28% 감소)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 22:07:44 +09:00
fbe18b6157 feat(schedule): 추천 검색어 기능 및 검색 UX 개선
- 추천 검색어 API 연동 (getSuggestions)
- SuggestionController로 추천 검색어 상태 관리
- 유튜브 스타일 검색 UX 구현
  - X 버튼 클릭 시 추천 검색어 화면으로 전환
  - 뒤로가기 시 검색 결과 화면 복원 및 검색어 유지
- 검색 결과 화면 전체 페이드 애니메이션으로 변경
- 입력 디바운스(200ms) 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 22:02:48 +09:00
36fb7bb310 feat(schedule): 일정 검색 기능 구현
- 검색 API 및 컨트롤러 추가 (페이지네이션 20개씩)
- 검색 모드 UI 구현 (툴바 전환 애니메이션)
- 검색 결과 카드 (날짜 왼쪽, 콘텐츠 오른쪽)
- 무한 스크롤 (500px 전 미리 로드)
- 뒤로가기 키로 검색 모드 종료
- 카드 등장 애니메이션 (페이드+슬라이드)
- 스크롤 시 이미 표시된 카드 애니메이션 스킵

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 21:23:22 +09:00
c4cbdc7d33 feat(schedule): 달력 UI 개선 및 검색 준비
- ExpandablePageView로 달력 높이 동적 조절 (월별 주 수에 따라)
- 데이트픽커 년도 변경 시 스와이프 애니메이션 추가
- 달력 월 변경 시 일정 점 비동기 업데이트 (캐시 기반)
- 모든 달력/데이트픽커 텍스트에 Pretendard 폰트 적용
- 데이트픽커 화살표 터치 영역 확대 및 ripple effect 추가
- 데이트픽커 펼침 시 툴바 좌우 화살표 숨김 (페이드 애니메이션)
- expandable_page_view 패키지 추가

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 20:37:00 +09:00
895d9c26a3 Flutter 앱: 달력 팝업 UI 개선
- 달력 열기 애니메이션 추가 (아래로 부드럽게 펼쳐짐)
- 툴바 영역 오버레이 제외 (툴바 아래부터 반투명 배경)
- 년월 텍스트 가운데 고정, 화살표는 옆에 별도 위치

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 18:31:54 +09:00
21bd887f5e Flutter 앱: 일정 화면 2단계 - 달력 팝업 구현
달력 아이콘 클릭시 달력 팝업 표시:
- 월 그리드 (요일 헤더 + 날짜 + 일정 점 표시)
- 년월 선택 모드 (년도 범위 + 월 선택)
- 오늘 버튼
- 배경 터치로 닫기

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 18:25:14 +09:00
671618442c Flutter 앱: 전체 화면 MVCS 아키텍처 리팩토링
홈, 멤버, 앨범 화면을 Riverpod 기반 MVCS 패턴으로 리팩토링.
View는 UI와 애니메이션만, Controller는 상태와 비즈니스 로직 담당.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 18:18:44 +09:00
bc37abe473 Flutter 앱: MVCS 아키텍처 리팩토링 (일정 화면)
- controllers/ 폴더 추가
- ScheduleController 생성 (Riverpod Notifier)
- ScheduleState 상태 클래스 분리
- ScheduleView를 ConsumerStatefulWidget으로 변경
- View는 UI 렌더링만, 비즈니스 로직은 Controller로 분리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 18:12:22 +09:00
221aaa2bb4 Flutter 앱: 일정 화면 1단계 구현 (날짜 선택기 + 일정 목록)
- 자체 툴바 (년월 표시, 이전/다음 월 버튼)
- 가로 스크롤 날짜 선택기 (일정 점 표시, 자동 중앙 스크롤)
- 일정 카드 (시간, 카테고리, 제목, 출처, 멤버)
- 순차적 페이드 인 애니메이션

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 18:06:50 +09:00
7a1e04b6ae 모바일 웹: 멤버 페이지 UI 개선 (앱 디자인 적용)
- 그리드 레이아웃에서 카드 스와이프 스타일로 변경
- 상단 썸네일 인디케이터 추가 (자동 스크롤, 클릭 이동)
- 멤버 페이지 헤더 그림자 제거 (noShadow prop)
- Swiper 라이브러리로 좌우 스와이프 구현
- 카드 그림자 및 레이아웃 최적화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 14:38:59 +09:00
3b5f8a93ca Flutter 앱: 다운로드 개선 및 불필요한 패키지 제거
- 다운로드 서비스 개선
  - 저장 경로를 Pictures/fromis_9 폴더로 변경 (갤러리 표시)
  - URL에서 파일 확장자 자동 추출 (동영상/이미지)
  - saveInPublicStorage 옵션으로 미디어 스캐너 트리거
- 티저 라이트박스에서 동영상 다운로드 지원
- video_thumbnail 패키지 제거 (백엔드에서 썸네일 처리)
- 티저 썸네일 위젯 간소화 (StatefulWidget → StatelessWidget)
- 홈 화면 하단 여백 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 14:15:51 +09:00
6b512f943e Flutter 앱: 컨셉포토 라이트박스 추가 및 이미지 프리로드 개선
- 컨셉포토 갤러리에 라이트박스 기능 추가
  - PhotoViewGallery로 이미지 스와이프 및 줌 지원
  - 멤버/컨셉 정보 바텀시트 (info 버튼)
  - 이미지 다운로드 기능
  - 슬라이딩 인디케이터
- PhotoViewGallery에 allowImplicitScrolling 옵션 추가
  - 인접 페이지 미리 빌드로 스와이프 시 즉시 표시
- 불필요한 수동 프리로드 코드 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 13:54:59 +09:00
300fe18a8d Flutter 앱: 컨셉포토 갤러리, UI 개선, 앱 이름 변경
- 컨셉포토 전체보기 화면 추가 (2열 Masonry 레이아웃)
- ConceptPhoto 모델에 width, height, members, concept 필드 추가
- 앨범 상세/갤러리 화면 스크롤 시 툴바 색상 고정
- 멤버 인디케이터 중앙 정렬 수정
- 티저 포토 → 티저 이미지로 명칭 변경
- 뒤로가기 두 번 종료 기능 제거
- 앱 이름 fromis9 → fromis_9로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 13:02:40 +09:00