Flutter 앱 골격 · 5탭 네비게이션 · 로그인 화면 · Firestore 보안 규칙·인덱스

This commit is contained in:
Sn-Kinos
2026-08-10 01:02:03 +09:00
parent fbba4405c3
commit 233ef99837
113 changed files with 8549 additions and 2 deletions
+66
View File
@@ -0,0 +1,66 @@
import 'package:flutter/material.dart';
import '../theme/tokens.dart';
/// 탭 루트 화면의 플레이스홀더.
///
/// 2주차 범위는 「앱 골격 · 5탭 네비게이션 · 소셜 로그인 · 디자인시스템」이다(별첨2).
/// 각 탭의 실제 화면은 3주차 이후이므로, 여기서는 어느 화면이 들어올 자리인지와
/// 근거 명세 경로만 보여 준다. 빈 화면을 두면 검수 때 무엇이 빠진 건지 알 수 없다.
class TabPlaceholder extends StatelessWidget {
const TabPlaceholder({
super.key,
required this.tab,
required this.screenId,
required this.screenName,
required this.specPath,
});
/// 계약 고정 탭 라벨(견적서 v2.1 5탭).
final String tab;
final String screenId;
final String screenName;
final String specPath;
@override
Widget build(BuildContext context) {
final text = Theme.of(context).textTheme;
return Scaffold(
appBar: AppBar(title: Text(screenName)),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(AppSpace.s5),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(tab, style: text.labelMedium),
const SizedBox(height: AppSpace.s2),
Text(screenName, style: text.displayMedium),
const SizedBox(height: AppSpace.s4),
Text(screenId, style: text.titleMedium),
const SizedBox(height: AppSpace.s5),
Container(
padding: const EdgeInsets.all(AppSpace.s4),
decoration: BoxDecoration(
color: AppColors.cosmicSurfaceContainer,
border: Border.all(color: AppColors.cosmicOutline),
borderRadius: BorderRadius.circular(AppRadius.md),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('2주차 범위: 탭 골격까지', style: text.bodyMedium),
const SizedBox(height: AppSpace.s2),
Text('화면 구현은 3주차 이후', style: text.bodySmall),
const SizedBox(height: AppSpace.s3),
Text(specPath, style: text.bodySmall),
],
),
),
],
),
),
),
);
}
}