Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions CHANGELOG.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,35 @@
{
"metadata": {
"lastUpdated": "2026-02-23T01:19:50Z",
"currentVersion": "1.0.40",
"lastUpdated": "2026-02-23T02:13:37Z",
"currentVersion": "1.0.41",
"projectType": "flutter",
"totalReleases": 11
"totalReleases": 12
},
"releases": [
{
"version": "1.0.41",
"project_type": "flutter",
"date": "2026-02-23",
"pr_number": 39,
"raw_summary": "## Summary by CodeRabbit\n\n## 릴리슀 λ…ΈνŠΈ\n\n* **New Features**\n * νƒ­ 기반 λ„€λΉ„κ²Œμ΄μ…˜ ꡬ쑰 λ„μž… (ν™ˆ, 검색, 지도, λ§ˆμ΄νŽ˜μ΄μ§€)\n * ν•˜λ‹¨ λ„€λΉ„κ²Œμ΄μ…˜ λ°” μΆ”κ°€\n * μƒˆλ‘œμš΄ νŽ˜μ΄μ§€ μΆ”κ°€: 검색, 지도, λ§ˆμ΄νŽ˜μ΄μ§€ (μ€€λΉ„ 쀑)\n\n* **Chores**\n * 버전 μ—…λ°μ΄νŠΈ (v1.0.41)",
"parsed_changes": {
"new_features": {
"title": "New Features",
"items": [
"νƒ­ 기반 λ„€λΉ„κ²Œμ΄μ…˜ ꡬ쑰 λ„μž… (ν™ˆ, 검색, 지도, λ§ˆμ΄νŽ˜μ΄μ§€)",
"ν•˜λ‹¨ λ„€λΉ„κ²Œμ΄μ…˜ λ°” μΆ”κ°€",
"μƒˆλ‘œμš΄ νŽ˜μ΄μ§€ μΆ”κ°€: 검색, 지도, λ§ˆμ΄νŽ˜μ΄μ§€ (μ€€λΉ„ 쀑)"
]
},
"chores": {
"title": "Chores",
"items": [
"버전 μ—…λ°μ΄νŠΈ (v1.0.41)"
]
}
},
"parse_method": "markdown"
},
{
"version": "1.0.40",
"project_type": "flutter",
Expand Down
18 changes: 16 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
# Changelog

**ν˜„μž¬ 버전:** 1.0.40
**λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ:** 2026-02-23T01:19:50Z
**ν˜„μž¬ 버전:** 1.0.41
**λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ:** 2026-02-23T02:13:37Z

---

## [1.0.41] - 2026-02-23

**PR:** #39

**New Features**
- νƒ­ 기반 λ„€λΉ„κ²Œμ΄μ…˜ ꡬ쑰 λ„μž… (ν™ˆ, 검색, 지도, λ§ˆμ΄νŽ˜μ΄μ§€)
- ν•˜λ‹¨ λ„€λΉ„κ²Œμ΄μ…˜ λ°” μΆ”κ°€
- μƒˆλ‘œμš΄ νŽ˜μ΄μ§€ μΆ”κ°€: 검색, 지도, λ§ˆμ΄νŽ˜μ΄μ§€ (μ€€λΉ„ 쀑)

**Chores**
- 버전 μ—…λ°μ΄νŠΈ (v1.0.41)

---

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ samples, guidance on mobile development, and a full API reference.
---

<!-- AUTO-VERSION-SECTION: DO NOT EDIT MANUALLY -->
## μ΅œμ‹  버전 : v1.0.39 (2026-02-23)
## μ΅œμ‹  버전 : v1.0.40 (2026-02-23)

[전체 버전 기둝 보기](CHANGELOG.md)
164 changes: 164 additions & 0 deletions lib/common/widgets/main_scaffold.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:go_router/go_router.dart';

import '../constants/home_colors.dart';

/// 메인 λ„€λΉ„κ²Œμ΄μ…˜ μ…Έ (ν•˜λ‹¨ λ„€λΉ„κ²Œμ΄μ…˜ λ°” + FAB)
///
/// StatefulShellRoute의 builderμ—μ„œ μ‚¬μš©λ˜λ©°,
/// 4νƒ­(ν™ˆ/검색/지도/마이) + 쀑앙 FAB(AI μΆ”μΆœ) ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
class MainScaffold extends StatelessWidget {
const MainScaffold({
super.key,
required this.navigationShell,
});

final StatefulNavigationShell navigationShell;

@override
Widget build(BuildContext context) {
return Scaffold(
body: navigationShell,
floatingActionButton: SizedBox(
width: 56.w,
height: 56.w,
child: FloatingActionButton(
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('AI μž₯μ†Œ μΆ”μΆœ κΈ°λŠ₯ μ€€λΉ„ 쀑'),
duration: Duration(seconds: 2),
),
);
},
elevation: 2,
backgroundColor: HomeColors.textPrimary,
foregroundColor: HomeColors.background,
shape: const CircleBorder(),
child: Icon(Icons.add, size: 28.sp),
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
bottomNavigationBar: _BottomNavBar(
currentIndex: navigationShell.currentIndex,
onTap: (index) => navigationShell.goBranch(
index,
initialLocation: index == navigationShell.currentIndex,
),
),
);
}
}

/// ν•˜λ‹¨ λ„€λΉ„κ²Œμ΄μ…˜ λ°” (4νƒ­ + 쀑앙 FAB 곡간)
class _BottomNavBar extends StatelessWidget {
const _BottomNavBar({
required this.currentIndex,
required this.onTap,
});

final int currentIndex;
final ValueChanged<int> onTap;

@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: HomeColors.background,
border: Border(
top: const BorderSide(color: HomeColors.divider, width: 1),
),
),
child: SafeArea(
child: SizedBox(
height: 56.h,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
_NavItem(
icon: Icons.home_outlined,
activeIcon: Icons.home,
label: 'ν™ˆ',
isSelected: currentIndex == 0,
onTap: () => onTap(0),
),
_NavItem(
icon: Icons.search,
activeIcon: Icons.search,
label: '검색',
isSelected: currentIndex == 1,
onTap: () => onTap(1),
),
SizedBox(width: 56.w), // FAB 곡간
_NavItem(
icon: Icons.map_outlined,
activeIcon: Icons.map,
label: '지도',
isSelected: currentIndex == 2,
onTap: () => onTap(2),
),
_NavItem(
icon: Icons.person_outline,
activeIcon: Icons.person,
label: '마이',
isSelected: currentIndex == 3,
onTap: () => onTap(3),
),
],
),
),
),
);
}
}

/// λ„€λΉ„κ²Œμ΄μ…˜ μ•„μ΄ν…œ (μ•„μ΄μ½˜ + 라벨)
class _NavItem extends StatelessWidget {
const _NavItem({
required this.icon,
required this.activeIcon,
required this.label,
required this.isSelected,
required this.onTap,
});

final IconData icon;
final IconData activeIcon;
final String label;
final bool isSelected;
final VoidCallback onTap;

@override
Widget build(BuildContext context) {
final color =
isSelected ? HomeColors.textPrimary : HomeColors.iconSecondary;

return GestureDetector(
onTap: onTap,
behavior: HitTestBehavior.opaque,
child: SizedBox(
width: 64.w,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
isSelected ? activeIcon : icon,
size: 24.sp,
color: color,
),
SizedBox(height: 2.h),
Text(
label,
style: TextStyle(
fontSize: 10.sp,
fontWeight: isSelected ? FontWeight.w600 : FontWeight.w400,
color: color,
),
),
],
),
),
);
}
}
47 changes: 47 additions & 0 deletions lib/features/map/presentation/pages/map_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

import '../../../../common/constants/home_colors.dart';
import '../../../../common/constants/text_styles.dart';

/// 지도 ν™”λ©΄ (Placeholder)
class MapPage extends StatelessWidget {
const MapPage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: HomeColors.background,
appBar: AppBar(
backgroundColor: HomeColors.background,
elevation: 0,
scrolledUnderElevation: 0,
title: Text(
'지도',
style: AppTextStyles.heading02.copyWith(
color: HomeColors.textPrimary,
),
),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.map_outlined,
size: 48.sp,
color: HomeColors.iconSecondary,
),
SizedBox(height: 16.h),
Text(
'지도 ν™”λ©΄ μ€€λΉ„ 쀑',
style: AppTextStyles.paragraph.copyWith(
color: HomeColors.textSecondary,
),
),
],
),
),
);
}
}
47 changes: 47 additions & 0 deletions lib/features/mypage/presentation/pages/mypage_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

import '../../../../common/constants/home_colors.dart';
import '../../../../common/constants/text_styles.dart';

/// λ§ˆμ΄νŽ˜μ΄μ§€ ν™”λ©΄ (Placeholder)
class MypagePage extends StatelessWidget {
const MypagePage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: HomeColors.background,
appBar: AppBar(
backgroundColor: HomeColors.background,
elevation: 0,
scrolledUnderElevation: 0,
title: Text(
'λ§ˆμ΄νŽ˜μ΄μ§€',
style: AppTextStyles.heading02.copyWith(
color: HomeColors.textPrimary,
),
),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.person_outline,
size: 48.sp,
color: HomeColors.iconSecondary,
),
SizedBox(height: 16.h),
Text(
'λ§ˆμ΄νŽ˜μ΄μ§€ μ€€λΉ„ 쀑',
style: AppTextStyles.paragraph.copyWith(
color: HomeColors.textSecondary,
),
),
],
),
),
);
}
}
47 changes: 47 additions & 0 deletions lib/features/search/presentation/pages/search_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

import '../../../../common/constants/home_colors.dart';
import '../../../../common/constants/text_styles.dart';

/// 검색 ν™”λ©΄ (Placeholder)
class SearchPage extends StatelessWidget {
const SearchPage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: HomeColors.background,
appBar: AppBar(
backgroundColor: HomeColors.background,
elevation: 0,
scrolledUnderElevation: 0,
title: Text(
'검색',
style: AppTextStyles.heading02.copyWith(
color: HomeColors.textPrimary,
),
),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.search,
size: 48.sp,
color: HomeColors.iconSecondary,
),
SizedBox(height: 16.h),
Text(
'검색 ν™”λ©΄ μ€€λΉ„ 쀑',
style: AppTextStyles.paragraph.copyWith(
color: HomeColors.textSecondary,
),
),
],
),
),
);
}
}
Loading